您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《计算机组成原理与汇编语言》 > 第3章 指令系统与汇编语言设计

第2节 8088数据传送指令

3.2.1 数据传送指令

 1. MOVOPRD1,OPRD2

    MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。
              
    源操作数可以是累加器、寄存器、存贮器以及立即操作数,而目的操作数可以是累加器、寄存器和存贮器。数据传送方向的示意图,如图3.13所示。

 
               各种数据传送指令例举如下:

             (1)在CPU各内部寄存器之间传送数据(除代码段寄存器CS和指令指针IP以外)。

               MOV AL,BL
               MOV DL,CH 8位数据传送指令(1个字节)
               MOV AX,DX
               MOV CX,BX
               MOV DX,BX } 16位数据传送指令(1个字)
               MOV DX,ES
               MOV BX,DI
               MOV SI,BP

             (2)立即数传送至CPU的内部通用寄存器(即AX、BX、CX、DX、BP、SP、SI、DI),给这些寄存器赋值。

               MOV CL, 4;8位数据传送(1个字节)
                MOV AX,03FFH;16位数据传送
               MOV S1,057BH; 16位数据传送(1个字)

             (3)CPU内部寄存器(除了CS和IP以外)与存贮器(所有寻址方式)之间的数据传送,与前述一样可以传送一个字节也可以传送一个字。

             ·在CPU的通用寄存器与存贮器之间传送数据:

               MOV AL, BUFFER
                MOV AX,[SI]
               MOV,[DI] CX
                MOV SI, BLOCK[BP]

             ·在CPU寄存器与存贮器之间传送数据:

               MOV DS,DATA[SI+BX]
               MOV DEST[BP+DI],ES

             例如,为了将在同一个段内的偏移地址为AREA1的数据传送到偏移地址为AREA2单元中去,就需要执行以下两条传送指令:

              MOV AL,AREA1
               MOV AREA2,AL

             如果要求将内存中一个数据块搬移到另一个内存数据区中时,例如要将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中去,可以
 

            用有循环控制的数据传送程序来实现。为此采用间接寻址方法,用SI存放源数据地址,DI存放目的数据地址,用CX作为循环计数控制单元。

           其程序如下:

             MOV SI,OFFSETAREA1
             MOV DI,OFFSETAREA2
             MOV CX,100
             AGAIN: MOV AL,[SI]
             MOV,[DI] AL
             INC SI
             INC DI
             DEC CX
             JNZ AGAIN

          2. 交换指令

              XCHG OPRD1,OPRD2
                    目的    源

              交换指令把一个字节或一个字的源操作数与目的操作数相交换。这种交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存贮器之 间进行,

              但是段寄存器不能作为一个操作数,例如:  

                XCHG AL,CL
                XCHG AX,DI
                XCHG BX,SI
                XCHG AX,BUFFER
                XCHG BX,DATA[SI]

         3. 地址传送指令

                8088有3条地址传送指令。

               (1)LEA指令
                   例如:
                        LEA OPRD1,OPRD2

               该指令把源操作数OPRD2的地址偏移量传送至目的操作 数OPRD1中。源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。

              这条指令通常用来建立串指令操作所需的寄存器指针。
                    

                         例如:LEA BX,BUFR是把变量BUFR的地址偏移量送到BX中。

                (2) LDS指令

                该指令完成一个地址指针的传送。地址指针包括段地址和地址偏移量。指令执行时,将段地址送入DS,地址偏移量送入一个16位的指针寄存器或变址寄存器。

                       例如:LDS SI,[BX]是把BX所指的32位地址指针的段地址送入DS,偏移地址送入SI。

                (3) LES指令

                这条指令除将地址指针的段地址送入ES外,其他操作与LDS的类似。

                       例如: LES DI,[BX+CONT]是把BX+CONT所指的32位地址指针的段地址送入ES,偏移地址送入DI4.堆栈操作指令
      

                堆栈是内存中的一个特定区域,由SS的内容和SP的内容来决定。对堆栈的操作具有先入后出的特点。用于堆栈操作的指令主要是:
                          

                           PUSH OPRD(压入堆栈指令)                                                  POP  OPRD(弹出堆栈指令)

                 堆栈操作指令中的操作数可以是段寄存器(除CS)的内容、16位的通用寄存器(标志寄存器有专门的出入栈指令)以及内存的16位字,例如,
                               

                                MOV  AX,8000H
                                MOV  SS,AX
                                MOV  SP,2000H
                                MOV  DX,3E4AH
                                PUSH DX
                                PUSH AX

                   当执行完两条压入堆栈的指令时,堆栈中的内容如图3.14所示。
                     

                   由图3.14可以解释压入堆栈的过程:

                         ①SP-1→SP
                         ②DH→(SP)
                         ③SP-1→SP
                         ④DL→(SP)

                     这就是把DX压入堆栈的过程。AX的压栈过程是一样的。

                     出堆栈的过程与此刚好相反,例如POPAX:

                         ①(SP)→AL
                         ②SP+1→SP
                         ③(SP)→AH
                         ④SP+1→SP

                    可见,SP的内容总是指向堆栈的顶。

 
       4. 字节、字转换指令

            有一条指令能将AL的符号位(bit7)扩展到整个AH中,它就是CBW,即将字节转换成一个字。

              例如,

                MOV AL,4FH
                CBW
           

            在执行完CBW之后,AX=004FH。另一条指令是将AX的符号位(bit15)扩展到整个DX,它就是CWD,即将字转换成双字。
           

               例如,

                MOV AX,834EH
                CWD
           

            执行完CWD之后,DX=FFFFH,DXAX=FFFF834EH