学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX
16lz
2021-04-30
学 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
posted on 2010-04-14 10:19 万一 阅读(5891) 评论(2) 编辑 收藏©著作权归作者所有:来自51CTO博客作者JLee79的原创作品,如需转载,请注明出处,否则将追究法律责任
更多相关文章
- 学 Win32 汇编[20]: 洞察标志寄存器
- jQuery中的$.ajax方法,以及基本的vue指令操作
- 深入理解计算机系统(4.1)------Y86指令集体系结构
- 冷月手撕408之操作系统(4)-操作系统的运行环境
- 0415作业-Vue常用指令及方法
- Git 工具和指令集合
- 【Vue框架学习】Vue常用指令、事件修饰符、按键修饰符、计算属性
- 第2部分- Linux ARM汇编ARM指令集变化和优势
- 第11部分- Linux ARM汇编 执行分支