文章目录
数据传送指令
操作数类型
操作数中有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指令一起使用
.data
val WORD 1000h
val2 WORD 2000h
.code
mov ax,val ;AX=1000h
xchg ax,val2 ;AX=2000h,val2=1000h
mov val,ax ;val=2000h,AX=1000h
JMP指令
在默认情况下,CPU是顺序加载并执行程序。但是当前指令的执行有可能是由条件的,它会按照CPU状态位的值把控制转向程序中的新位置
汇编语言程序使用条件指令来实现IF语句的高级语句和循环。每条条件指令都包含了一个可能的转向不同内存地址的转移。
控制转移分为两种基本类型:
- 无条件转移:无论什么情况都会转移到新地址.新地址加载到指令指针寄存器,使得程序在新地址进行执行。使用JMP指令实现
- 条件转移:满足某种条件,则程序出现分支。CPU根据 ECX和标志寄存器的内容来判断真/条件
JMP指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移量