数据传送指令
**************************************************************************************************
1、传送指令MOV(move)
**************************************************************************************************
传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。指令的格式如下:
MOV Reg/Mem, Reg/Mem/Imm
其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。
**************************************************************************************************
2、传送—填充指令
**************************************************************************************************
传送—填充指令是把位数短的源操作数传送给位数长的目的操作数。指令格式如下:
MOVSX/MOVZX Reg/Mem, Reg/Mem/Imm     
其中:80386+表示80386及其之后的CPU,其它类似符号含义类同,不再说明。
指令的主要功能和限制与MOV指令类似,不同之处是:在传送时,对目的操作数的高位进行填充。根据其填充方式,又分为:符号填充和零填充。

符号填充指令MOVSX
MOVSX的填充方式是:用源操作数的符号位来填充目的操作数的高位数据位

零填充指令MOVZX
MOVZX的填充方式是:恒用0来填充目的操作数的高位数据位

例如,AL=87H,指令MOVSX CX, AL;MOVZX DX, AL执行后,问CX和DX的值是什么?

根据传送-填充指令的填充方式可知:
指令MOVSX CX, AL执行后,(CX)=0FF87H,指令MOVZX DX, AL执行后,(DX)=0087H。


从上例可看出,两条指令的源操作数完全一样,但因为它们的填充方式不同,所得到的结果而就不同。
**************************************************************************************************
3、交换指令XCHG
**************************************************************************************************
交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同。其指令格式如下:
XCHG Reg/Mem, Reg/Mem

例如,AX=5678H,BX=1234H,指令XCHG AX, BX执行后,AX和BX的值是什么?

这是两个寄存器内容进行交换,指令执行后,有:(AX)=1234H,(BX)=5678H。
**************************************************************************************************
4、取有效地址指令LEA(Load)
**************************************************************************************************
指令LEA是把一个内存变量的有效地址送给指定的寄存器。其指令格式如下:
LEA Reg, Mem
**************************************************************************************************
5、取段寄存器指令
该组指令的功能是把内存单元的一个“低字”传送给指令中指定的16位寄存器,把随后的一个“高字”传给相应的段寄存器(DS、ES、FS、GS和SS)。其指令格式如下:
LDS/LES/LFS/LGS/LSS Reg, Mem
**************************************************************************************************
6、堆栈操作指令
**************************************************************************************************
堆栈是一个重要的数据结构,它具有“先进后出”的特点,通常用来保存程序的返回地址。它主要有两大类操作:进/压栈操作和出/弹栈操作。

1)、进栈操作

、PUSH
指令格式:PUSH Reg/Mem
PUSH Imm          
一个字进栈,系统自动完成两步操作:SP←SP-2,(SP)←操作数;
一个双字进栈,系统自动完成两步操作:ESP←ESP-4,(ESP)←操作数。

、PUSHA
指令格式:PUSHA      
其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。

、PUSHAD
指令格式:PUSHAD      
其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。

2)、出栈操作
、POP
指令格式:POP Reg/Mem
弹出一个字,系统自动完成两步操作:操作数←(SP),SP←SP-2;
弹出一个双字,系统自动完成两步操作:操作数←(ESP),ESP←ESP-4。

、POPA
指令格式:POPA       
其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。其实,程序员不用记住它们的具体顺序,只要与指令PUSHA对称使用就可以了。

、POPAD
指令格式:POPAD    
其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈,它与PUSHAD对称使用即可。
**************************************************************************************************