数据传送指令
MOV指令
MOV基本格式:
MOV dst,src
左边是目的操作数,右边是源操作数,该指令有以下限制:
两个操作数必须大小一致;
两个操作数不能同时为内存操作数;
指令寄存器不能作为目的操作数;
MOV的标准格式:
MOV reg,reg
MOV mem,reg
MOV reg,mem
MOV mem,imm
MOV reg,imm
实现内存到内存的数据传送需要借助中间寄存器。
整数的全零/符号扩展
MOVZX指令(进行全零扩展并传送),该指令只用于无符号数,MOVSX指令(进行符号扩展并传送),该指令只用于有符号数。
以上两条指令的目的操作数必须位寄存器且源操作数的长度必须短于目的操作数且源操作数不能为常数。
.data
byteval byte 10001111b
.code
movsx ax,byteval
执行以上代码后,ax的值为1111111110001111b
LAHF与SAHF
LAHF将EFLAGS寄存器的低字节复制到AH,SAFH将AH复制到EFLAGS的低字节
XCHG指令
交换两个操作数,有三种形式:
XCHG reg,reg
XCHG mem,reg
XCHG reg,mem
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
val1 word 1000h
val2 word 2000h
arrayB byte 10h,20h,30h,40h,50h
arrayW word 100h,200h,300h
arrayD dword 10000h,20000h,30000h
.code
main PROC
mov bx,0a69bh
movzx eax,bx
movzx edx,bl
movzx cx,bl
mov bx,0a69bh
movsx eax,bx
movsx edx,bl
mov bl,7bh
movsx cx,bl
mov ax,val1
xchg ax,val2
mov val1,ax
mov al,arrayB
mov al,[arrayB+1]
mov al,arrayb+2
mov ax,arrayW
mov ax,arrayW+2
mov eax,arrayD+4
INVOKE EXITPROCESS,0
main ENDP
END main