`
zzc1684
  • 浏览: 1190420 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

学 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, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data?   val dd ? .code main proc   mov val, 123   mov edx, val   mov eax, edx   PrintDec eax ;123   ret main endp end main


LEA(Load Effective Address): 有效地址传送指令



;该指令不影响 EFlags
;指令格式:
LEA r, m

; Test21_2.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data   szText db 'ABCDEFG', 0 .code main proc   lea eax, offset szText   lea ebx, szText   PrintHex eax ;00403000   PrintHex ebx ;00403000   ret main endp end main


XCHG(Exchange): 交换指令



;该指令不影响 EFlags
;指令格式:
XCHG r/m, r/m

; Test21_3.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data   val1 dd 111   val2 dd 222 .code main proc   mov eax, val1   xchg eax, val2   mov val1, eax   PrintDec val1 ;222   PrintDec val2 ;111   ret main endp end main


XLATB(Translate Byte)、XLAT(Translate): 换码指令



;XLATB 可简化为 XLAT
;该指令不影响 EFlags

;XLAT 无参数, 操作和 EBX、AL 相关
;执行 XLAT 前, 先把源地址放入 EBX, 把字节序号放入 AL
;执行后, 指定字节被读入 AL

; Test21_4.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data   szText db 'ABCDEFG', 0 .code main proc   lea ebx, szText   mov al, 1   xlat   PrintHex al ;42 - 这是 'B' 的 ASSII 编码     mov al, 2   xlatb   PrintHex al ;43 - 这是 'C' 的 ASSII 编码   ret main endp end main


MOVZX(Move With Zero-Extend): 零扩展传送



;该指令不影响 EFlags
;指令格式:
MOVZX r32, r16/m16
MOVZX r16, r8/m8

;示例同 MOVSX


MOVSX(Move With Sign-Extend): 符号扩展传送



;该指令不影响 EFlags
;指令格式:
MOVZX r32, r16/m16
MOVZX r16, r8/m8

;MOVZX 和 MOVSX 的区别是:
;1、MOVZX 会将目标寄存器中高出的位补 0
;2、如果源操作数的最高位是 1, MOVSX 会将目标寄存器中高出的位补 1; 反之补 0

; Test21_5.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data   bVal db 90h   dwVal1 dw 7FFFh   dwVal2 dw 8000h .code main 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   ret main endp end main
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics