8086指令系统总结
我们对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]指定的内存单元 |
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
