我们对8086 CPU的指令系统进行一下总结,详细应用请参考指令手册。
8086CPU提供以下几类指令
1.数据传送指令
例子如下表所示(表中只是列出了常用的指令,并非全部,下同),这些指令实现寄存器和内存,寄存器和寄存器之间单个数据传送。
指令 | 解释 |
---|---|
mov | move,移动指令,两个操作对象 |
push | 将操作对象表示的数据入栈(stack) |
pop | 将操作对象表示的数据出栈(stack) |
pushf | push flag 将标志寄存器的值压栈 |
popf | pop flag 从栈中弹出数据,送入标志寄存器中 |
xchg | 两个寄存器,寄存器和内存变量之间内容的交换指令 |
2.算术运算指令
顾名思义,这些指令实现寄存器和内存中的数据的算术运算。它们的执行结果影响标志寄存器的sf, zf, of, cf, pf, af位。
指令 | 解释 |
---|---|
add | 算术加 |
sub | 算术减 |
adc | 带进位加法指令,它利用CF位上记录的进位值 |
sbb | 带借位减法指令,它利用CF位上记录的借位值 |
inc | 累加1指令 |
dec | 减1指令 |
cmp | 比较指令,功能相当于减法指令,但不保存结果,将对标志寄存器产生影响 |
imul | 有符号数乘法,与 mul 指令不同,imul 会保留乘积的符号 |
idiv | 有符号数除法,与 div指令不同,idiv会保留相除的符号 |
aaa | AAA ( 加法后的 ASCII 调整 ) 指令调整 ADD 或 ADC 指令的二进制运算结果。设两个 ASCII 数字相加,其二进制结果存放在 AL 中,则 AAA 将 AL 转换为两个非压缩十进制数字存入 AH 和 AL。一旦成为非压缩格式,通过将 AH 和 AL 与 30h 进 OR 运算,很容易就能把它们转换为 ASCII 码 |
3.逻辑指令
指令进行逻辑运算,除了not指令外,他们的执行效果都将影响标志寄存器的相关标志位。
指令 | 解释 |
---|---|
and | 按位“与” |
or | 按位“或” |
not | 指令触发(翻转)操作数中的所有位。其结果被称为反码 |
xor | 按位“异或” |
test | 在两个操作数的对应位之间进行 AND 操作, AND 指令唯一不同的地方是,TEST 指令不修改目标操作数 |
shl | 逻辑左移指令(left),最低位用0补充 |
shr | 逻辑右移指令(right),最高位用0补充 |
sal | 算数左移指令,在执行时将操作数看成带符号数进行移位 |
sar | 算数右移指令,在执行时将操作数看成带符号数进行移位 |
rol | 循环左移 |
ror | 循环右移 |
rcl | 带进位循环左移指令把每一位都向左移,进位标志位复制到 LSB,而 MSB 复制到进位标志位 |
rcr | 带进位循环右移指令把每一位都向右移,进位标志位复制到 MSB,而 LSB 复制到进位标志位 |
4.转移指令
可以修改IP,或同时可以修改CS和IP的指令统称为转移指令。转移指令分为以下几类:
(1) 无条件转移指令
指令 | 解释 |
---|---|
jmp | 无条件转移指令 |
(2) 条件转移指令
指令 | 解释 |
---|---|
jcxz | 如果(cx)=0,转移到标号处执行,都是短转移 |
je | 等于(equal)则转移 |
je | 不等于(not equal)则转移 |
jb | 低于(below)则转移 |
jnb | 不低于(not below)则转移 |
ja | 高于(above)则转移 |
jna | 不高于(not above)则转移 |
(3) 循环指令
指令 | 解释 |
---|---|
loop | 循环指令,所有的循环指令都是短转移 |
(3) 过程指令
指令 | 解释 |
---|---|
call | 将当前的CS和IP入栈,然后转移(不能实现短转移) |
ret | 用栈中的数据,修改IP的内容,从而实现近转移 |
retf | 用栈中的数据,修改CS和IP中的内容,从而实现远转移 |
(4) 中断指令
指令 | 解释 |
---|---|
int | 利用中断类型码,引发中断过程 |
iret | 当使用iret指令返回到相同保护级别的任务时,iret会从堆栈弹出代码段选择子及指令指针分别到CS与IP寄存器,并弹出标志寄存器内容到EFLAGS寄存器 |
5.处理机控制指令
这些指令是对标志寄存器或其他处理机状态进行设置。
指令 | 解释 |
---|---|
cld | 将标志寄存器的 df 位置0 |
std | 将标志寄存器的 df 位置1 |
cli | 禁止中断发生, 即屏蔽中断,IF=0 |
sti | 允许中断产生,IF=1 |
nop | 无操作 |
clc | CF = 0 |
cmc | CF取反 |
stc | CF = 1 |
hlt | 它会暂停中央处理单元(CPU),直到触发下一个外部中断为止 |
wait | 用来等待指令的指令 |
esc | 当8086遇到带有两个寄存器操作数的ESC指令时,它将执行一次nop。当处理器遇到带有存储操作数的ESC指令时,将从存储操作数指示的地址开始执行读取周期,并丢弃结果 |
lock | 被修饰的汇编指令成为“原子的”; 与被修饰的汇编指令一起提供内存屏障效果 |
6.串处理指令
这些指令对内存中的批量数据进行处理。若要使用这些指令方便地进行批量数据的处理,则需要和rep,repe,repn等前缀指令配合使用。
指令 | 解释 |
---|---|
movsb | 将数据从 ESI 指向的内存位置复制到 EDI 指向的内存位置, 字节为单位 |
movsw | 同上,字为单位 |
movsd | 同上,双字为单位 |
cmps | CMPS指令比较两个字符串 |
scas | 用于搜索一个特定的字符或字符串中的字符集 |
lods | 指令规定源操作数为(DS:SI),目的操作数隐含为AL(字节)或AX(字)寄存器 |
stos | 将AL/AX/EAX的值存储到[EDI]指定的内存单元 |