文章目录
数据传送指令
操作数类型
操作数中有3基本类型
- 立即数:使用数字文本表达式
- 寄存器操作数:使用CPU内已命名的寄存器
- 内存操作数:引用内存位置
MOV指令
- MOV指令将源操作数复制到目的操作数
- 目的操作数的内容会发生改变,源操作数不会改变
MOV destination,source
- 使用原则
- 两个操作数必须是同样的大小
- 两个操作数不能同时为内存操作数
- 指令指针寄存器(IP、EIP、RIP)不能作为目的操作数
- 单条MOV指令不能用于直接将数据从一个内存位置传送到另一个内存位置
- 在源操作数的值赋给内存操作数之前,必须先将该数值传送给一个寄存器
针对第5条原则举例:
.data
var1 WORD ?
var2 WORD ?
.code
mov ax,var1
mov var2,ax
MOVZX指令(只用于无符号整数)
MOVZX指令(进行全零扩展并传送)将源操作数复制到目的操作数
注意:源操作数不能是常数
举例:
.data
val BYTE 10001111b
.code
movzx ax,val ;AX=0000000010001111b
MOVSX指令(只用于有符号整数)
MOVSX指令(进行全零扩展并传送)将源操作数复制到目的操作数。
操作数在进行符号扩展时,在目的操作数上全部扩展位上重复(复制)长度较小操作数的最高位。
举例1:
.data
val BYTE 10001111b
.code
movsx ax,val ;AX=1111111110001111b
举例2:
mov bx,0A69Bh ;该处的0是一种方便的表示法,用于防止汇编器将常数误认为标识符
movsx eax,bx ;EAX=FFFFA69Bh
movsx edx,bl ;EDX=FFFFFF9Bh
movsx cx,bl ;CX=FF9Bh
LAHF和SAHF指令
LAHF(加载状态标志位到AH)指令将EFLAGS寄存器的低字节复制到AH。
被复制的标志位包括:符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位。使用该指令,可以方便的把标志位副本保管在变量中。
举例:
.data
saveflags BYTE ?
.code
lahf ;将标志位加载到AH
mov saveflags,ah ;用变量保存这些标志位
SAHF(保存AH内容到状态标志位)指令将AH内容复制到EFLAGS(或RFLAGS)寄存器低字节。
举例:
mov ah,saveflags ;加载被保存的标志位到AH中
sahf ;复制到EFLAGS寄存器
XCHG指令
XCHG(交换数据)指令交换两个操作数内容
- 使用原则
- 除了不适用立即数做操作数外,XCHG指令操作数的要求与MOV指令操作数要求一样
举例:
xchg ax,bx ;交换16位寄存器内容
xchg ah,bl ;交换8位寄存器内容
xchg var1,bx ;交换16位内存操作数和BX寄存器内容
xchg eax,ebx ;交换32位寄存器内容
如果要交换两个内存操作数,则用寄存器作为临时容器,把MOV指令与XCHG指令一起使用