这一部分主要记录一下课程中学习到的基本指令。
数据传送类指令
功能:把数据、地址或者立即数传送到寄存器或者存储单元中。
MOV指令
语法:MOV reg/mem/seg(目的操作数), reg/mem/seg/imm(源操作数)
- reg:通用寄存器
- mem:内存单元,形如[EA] (EA为有效地址,即偏移地址)
- seg:段寄存器
- imm:立即数
将源操作数src复制到目的操作数dst中,结果是目的操作数的内容等于源操作数的内容,源操作数的内容不变。
重要说明:
- 双操作数不能同时为段寄存器或者内存
- 代码段寄存器CS和立即数不能作为目的操作数,立即数不能直接传送到段寄存器中
- dest与src必须类型匹配(位数一致)
XCHG指令
语法:XCHG reg/mem(dest), reg/mem(src)
交换dest和src中的内容。
栈操作
进栈指令
格式:PUSH reg/mem/seg(src)
将把src中的内容存入SP指向的内存(地址对应)
隐藏了目的操作数SP+1与SP(双字)。
出栈指令
格式:POP reg/mem/seg(src)
与上面的进栈指令相逆。
标志处理指令
除了有一些指令影响标志位外,80x86还提供了一组设置或清除标志位指令,它们只影响本指令指定的标志,而不影响其他标志位。如
- CLD 方向标志置0指令
- CLI 中断标志置0指令
地址传送指令
LEA reg16,mem
主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定的寄存器。
注意:LEA与MOV指令相比,最大的区别在于LEA是将偏移地址送入寄存器,而MOV是将存储单元中的内容送入寄存器(或其他)。
段寄存器装入指令
LDS/LES REG, SRC
LDS指定的段寄存器是DS,LES指定的段寄存器是ES;其中的SRC只能使用存储器寻址方式,目的寄存器不允许使用段寄存器。
累加器专用传送指令
IN AL, PORT(字节)
IN AX, PORT(字)
OUT PORT, AL
OUT PORT, AX
算术指令
加法指令
ADD dest,src
将dest和src相加,并将和保留在目的操作数中。
会改变标志位。
ADC dest,src
带进位的加法指令,会加上进位CF。
INC opr
类型转换指令
CBW 字节转换为字指令:AL的内容符号扩展到AH,形成AX中的字。
CWD 字转换为双字指令:AX的内容符号扩展到DX,形成DX,AX中的双字。
位操作指令
逻辑与、逻辑或、逻辑异或
逻辑非指令:操作数按位取反
NOT reg/mem
移位指令
分为逻辑左移(SHL)、逻辑右移,算术左移(SAL)、算术右移,循环左移(ROL)、循环右移,带CF位的循环左移(RCL)和循环右移。
语法格式:移位指令 dest, Count
当移位次数大于1时,必须将移位次数提前送至CL寄存器,再执行移位指令。
- 逻辑移位:不考虑符号位(每次移位后补零)
- 算术移位:考虑符号位(左移补零,右移补符号位)
控制转移指令
无条件转移指令:JMP
段内直接转移
JMP SHORT OPR
段内间接近转移
JMP WORD PTR OPR
段间直接远转移
段间间接远转移
JMP DWORD PTR OPR
EA内容送入IP,EA+2内容送入CS。