数据传输指令

1.通用数据传送指令

      数据传送指令负责把数据、地址或立即数传送到寄存器或存储单元中。

       MOV (move)
       MOV指令从源操作数向目的操作数拷贝数据。作为数据传送指令,几乎每个程序中都会用到这条指令。其基本格式是:第一个操作数是目的操作数,第二个操作数是源操作数。MOV指令的源操作数与目的操作数必须有一个是寄存器,且两个操作数的位数相等。

     MOVSX

       MOVSX指令将源操作数的内容拷贝到目的操作数中,并将该值符号扩展至16或32位。该指令只能用于有符号数。该指令有三种格式:
        MOVSX 32位操作数,8位操作数
        MOVSX 16位操作数,8位操作数
        MOVSX 32位操作数,16位操作数

     MOVZX

       MOVZX指令将源操作数的内容拷贝到目的操作数中,并将该值零扩展至16位或32位。该指令至能用于无符号数。该指令格式同上(movsx)

     PUSH

       PUSH指令首先减小ESP的值,然后将一个16位或者32位的源操作数拷贝至堆栈段上。对于16位操作数,ESP值减2;对于32位操作数,ESP值减4。push指令有三种格式:

        PUSH 16位操作数

        PUSH 32位操作数
        PUSH 32位立即数

      POP

        POP指令首先将ESP所指的堆栈元素拷贝到16位或32位的目的操作数中,然后增加ESP的值。如果操作数是16位的,ESP值将加2;如果操作数是32位的,ESP值将加4。其格式如下:
        POP 16位操作数
        POP 32位操作数

        PUSHFD与POPFD指令

      PUSHFD指令在堆栈上压入32位的EFLAGS寄存器的值,POPFD指令将对战顶部的值弹出并送至EFLAGS寄存器:
            PUSHFD
              POPFD

        实地址模式程序使用PUSHF指令在堆栈上压入16位的FLAGS寄存器的值,使用POPF指令从堆栈顶部弹出16位值并送到FLAGS寄存器。

        在使用这种类型的标志的备份并在后面回复是很有用的,使用的方法之一就是用PUSHFD和POPFD把指令块包围起来,使用这种类型的标志压栈和标志出栈指令的时候,读者必须精心设计以保证程序的执行路径不要跳过POPFD指令。随着时间的退役,再修改程序时将很难记清楚所有的压栈和出栈指令都在哪里。可以完成同样功能但或许可以少犯错误的方法是将标志保存在变量中。

        PUSHAD,PUSHA,POPAD和POPA指令

       PUSHAD指令在堆栈上按下列顺序压入所有的32位通用寄存器:EAX,ECX,EDX,EBX,ESP的原始值,EBP,ESI和EDI;POPAD指令以相反顺序从堆栈中弹出这些通用寄存器。与之类似,80286处理器引入的PUSHA指令以相同的顺序压入所有的16位寄存器(AX,CX,DX,BX,SP的原始值,BP,SI和DI);POPA指令则以相反顺序弹出这些寄存器。

     XCHG

     XCHG指令交换两个操作数的内容,两个操作数必须有一个是寄存器,且两个操作数的位数必须相同。

2.累加器专用传送指令

      LEA

       LEA指令把源操作数的有效地址送到指定的寄存器中。该指令的源操作数必须是存储器操作数,可使用除立即数和寄存器外的任一种存储器寻址方式。目的操作数可使用16位或32位寄存器,但不能使用段寄存器。该指令吥影响标志位。格式为:
      LEA 寄存器,存储器

       LDS,LES,LFS,LGS和LSS指针送寄存器和段寄存器

      该组指令的源操作数只能用存储器寻址方式,根据任一种存储器寻址方式找到一个存储单元。当指令指定的是16位寄存器时,把该存储单元中存放的16位便宜地址装入该寄存器中,然后把偏移地址+2中的16位数装入指令指定的段寄存器中;当指令指定的是32位寄存器时,把该存储单元中存放的32位偏移地址装入该地址寄存器中,然后把偏移地址+4中的16位数装入指令指定的段寄存器中。该组指令的目的操作数不允许使用段寄存器,LFS,LGS,LSS只能使用于386及其后继机型中。本组指令不影响标志位。格式(以LDS为例,其余相同):
           LDS 寄存器,存储器

3.标志寄存器传送指令

        LAHF

        LAHF指令将标志送至AH,即将FLAGS的低字节送至AH,格式:

               LAHF

       SAHF

       SAHF指令将AH送标志寄存器,即将AH送至FLAGS的低字节,格式:

                 SAHF

4.类型转换指令

     CBW   

       CBW指令将AL中存放的字节行数据进行扩展,扩展到AH,形成AX中的字型。格式:
                CBW

     CWD

       CWD指令将AX中存放的字节行数据进行扩展,扩展到DX,形成EAX中的双字型。格式:
                CWD

     CDQ   

     CDQ指令将DX:AX(EAX)中存放的字节行数据进行扩展,扩展到EDX,形成EDX:EAX中的四字型。格式:
               CDQ

     BSWAP   

       BSWAP指令使指定的32位寄存器的字节次序变反。格式:
              BSWAP 32位寄存器

           例:BSWAP EBX

       若执行指令前(EBX)=12345678H,执行后(EBX)=87654321H,字节次序变反。此指令只能用于486及其后继机型。
         本组指令不影响标志位。