学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX
汇编指令的一般性要求: 1、两个操作数的尺寸必须一致; 2、操作数不能同为内存.
MOV(Move): 最常用的数据传送指令
;该指令不影响 EFlags;指令格式: (其中的 r、m、i 分别表示: 寄存器、内存、立即数)MOV r/m, r/m/i; Test21_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data?? val dd ?.codemain proc? mov val, 123? mov edx, val? mov eax, edx? PrintDec eax ;123? retmain endpend main
LEA(Load Effective Address): 有效地址传送指令
;该指令不影响 EFlags;指令格式:LEA r, m; Test21_2.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data? szText db 'ABCDEFG', 0.codemain proc? lea eax, offset szText? lea ebx, szText? PrintHex eax ;00403000? PrintHex ebx ;00403000? retmain endpend main
XCHG(Exchange): 交换指令
;该指令不影响 EFlags;指令格式:XCHG r/m, r/m; Test21_3.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data? val1 dd 111? val2 dd 222.codemain proc? mov eax, val1? xchg eax, val2? mov val1, eax? PrintDec val1 ;222? PrintDec val2 ;111? retmain endpend main
XLATB(Translate Byte)、XLAT(Translate): 换码指令
;XLATB 可简化为 XLAT;该指令不影响 EFlags;XLAT 无参数, 操作和 EBX、AL 相关;执行 XLAT 前, 先把源地址放入 EBX, 把字节序号放入 AL;执行后, 指定字节被读入 AL; Test21_4.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data? szText db 'ABCDEFG', 0.codemain proc? lea ebx, szText? mov al, 1? xlat? PrintHex al ;42 - 这是 'B' 的 ASSII 编码? ? mov al, 2? xlatb? PrintHex al ;43 - 这是 'C' 的 ASSII 编码? retmain endpend main
MOVZX(Move With Zero-Extend): 零扩展传送
;该指令不影响 EFlags;指令格式:MOVZX r32, r16/m16MOVZX r16, r8/m8;示例同 MOVSX
MOVSX(Move With Sign-Extend): 符号扩展传送
;该指令不影响 EFlags;指令格式:MOVZX r32, r16/m16MOVZX r16, r8/m8;MOVZX 和 MOVSX 的区别是:;1、MOVZX 会将目标寄存器中高出的位补 0;2、如果源操作数的最高位是 1, MOVSX 会将目标寄存器中高出的位补 1; 反之补 0; Test21_5.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data? bVal db 90h? dwVal1 dw 7FFFh? dwVal2 dw 8000h.codemain proc? movzx eax, dwVal1? movsx edx, dwVal1? PrintHex eax ;00007FFF? PrintHex edx ;00007FFF? ? movzx eax, dwVal2? movsx edx, dwVal2? PrintHex eax ;00008000? PrintHex edx ;FFFF8000? ? mov cl, bVal? movzx ax, cl? movsx dx, cl? PrintHex ax ;0090? PrintHex dx ;FF90? retmain endpend main