8086指令系统 算数运算指令
Posted _DiMinisH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8086指令系统 算数运算指令相关的知识,希望对你有一定的参考价值。
算数运算指令
指令 | 作用 |
---|---|
ADD OPRD1, OPRD2 | OPRD1 <- OPRD1 + OPRD2 |
ADC OPRD1, OPRD2 | OPRD1 <- OPRD1 + OPRD2 + CF |
INC OPRD | OPRD <- OPRD + 1 |
INC BYTE PTR SEGMENT:[REG] | 将 内存中SEGMENT段的 以REG的内容为偏移地址+1 的单元 的数据 送回REG中 |
SUB OPRD1, OPRD2 | OPRD1 <- OPRD1 - OPRD2 |
SBB OPRD1, OPRD2 | OPRD1 <- OPRD1 - OPRD2 - CF |
DEC OPRD | OPRD <- OPRD - 1 |
DEC BYTE PTR SEGMENT:[REG] | 将 内存中SEGMENT段的 以REG的内容为偏移地址-1 的单元 的数据 送回REG中 |
NEG OPRD | OPRD <- 0 - OPRD |
CMP OPRD1, OPRD2 | OPRD1 - OPRD2 |
MUL OPRD | 8位:O × AL 结果存入 AX |
MUL OPRD | 16位:O × AX 结果存入 DX:AX (DX存高16位, AX存低16位) |
IMUL OPRD | 8位:O × AL 结果存入 AX |
IMUL OPRD | 16位:O × AX 结果存入 DX:AX (DX存高16位, AX存低16位) |
DIV OPRD | 8位:O × AL 结果存入 AX |
DIV OPRD | 16位:AX 中存放 DX:AX ÷ O, AX 中存放 DX:AX % O (取余) |
IDIV OPRD | 8位:O × AL 结果存入 AX |
IDIV OPRD | 16位:AX 中存放 DX:AX ÷ O, AX 中存放 DX:AX % O (取余) (上述除法的 商和余数 都带符号, 余数的符号与被除数符号相同) |
算数运算的大多数指令都会对标志位FLAGS寄存器产生影响
FLAGS寄存器
FLAGS称为 标志寄存器 或 程序状态字(PSW),是一个16位的寄存器,其中只使用了9位,6个状态标志和3个控制标志
1. 状态标志位用来记录算数和逻辑运算的特征
标志位名称 | 作用 | 解释 |
---|---|---|
CF | 进位标志位 | 当加(减)运算时,最高位向前有进位(借位),CF = 1,否则CF = 0 |
PF | 奇偶标志位 | 当运算结果的低8位中1的个数为偶数时,PF = 1,为奇数时,PF = 0 |
AF | 辅助进位标志位 | 在加(减)运算时,D3向D4 有进位(借位),AF = 1,否则AF = 0 |
ZF | 零标志位 | 当运算结果为0时,ZF = 1,否则ZF = 0 |
SF | 符号标志位 | 当运算结果的最高位为1时,SF = 1,否则SF = 0 |
OF | 溢出标志位 | 当算数运算的结果超出了带符号数的范围时,OF = 1,否则OF = 0 |
2. 控制标志位用来设置条件控制
标志位名称 | 作用 | 解释 |
---|---|---|
TF | 陷阱标志位 | 当TF = 1时,激活处理器调试特性,使CPU处于单步执行模式。每执行一条指令,自动产生一次单步中断 |
IF | 中断允许标志位 | IF = 1使CPU可以响应可屏蔽中断请求;IF = 0使CPU禁止响应可屏蔽中断请求;IF的状态对不可屏蔽中断及内部中断没有影响 |
DF | 方向标志位 | 操控串操作时的方向,DF = 1按减地址(从高地址向减地址),DF = 0按增地址(从低地址向高地址) |
1. 不进位加法指令
段寄存器不能作为操作数
ADD O1,O2
对6个状态标志位都会产生影响
功能:
O1 + O2 的结果存入 O1
2. 进位加法指令
段寄存器不能作为操作数
ADC O1,O2
对6个状态标志位都会产生影响
功能:
O1 + O2 + CF 的结果存入 O1
3. 自增指令
段寄存器不能作为 操作数 和 立即数
INC O
对5个状态标志位会产生影响,除了CF
功能:
O + 1 的结果存入 O
INC BYTE PTR SEGMENT:[REG]
功能:
将 内存中SEGMENT段的 以REG的内容为偏移地址+1 的单元 的数据 送回REG中
4. 不借位减法指令
段寄存器不能作为操作数
SUB O1,O2
对6个状态标志位都会产生影响
功能:
O1 - O2 的结果存入 O1
5. 借位减法指令
段寄存器不能作为操作数
SBB O1,O2
对6个状态标志位都会产生影响
功能:
O1 - O2 - CF 的结果存入 O1
6. 自减指令
段寄存器不能作为 操作数 和 立即数
DEC O
对5个状态标志位会产生影响,除了CF
功能:
O - 1 的结果存入 O
DEC BYTE PTR SEGMENT:[REG]
功能:
将 内存中SEGMENT段的 以REG的内容为偏移地址-1 的单元 的数据 送回REG中
7. 求补指令
段寄存器不能作为 操作数 和 立即数
NEG O
对6个状态标志位都会产生影响
0 - O 的结果存入 O
注意:
(1). 一般情况下,指令都会使CF = 1,除非操作数是 0
(2). 只有操作数是80H(-128)或8000H(-32768)时,指令会使OF = 1,操作数结果不变,其他情况下OF = 0,结果改变
8. 比较指令
CMP O1,O2
对6个状态标志位都会产生影响
功能:
O1 - O2 ,结果不要了
对于无符号数
CF | SF | 操作数1 | 操作数2 | 结果 |
---|---|---|---|---|
0 | 任意 | 大 | 小 | O1 > O2 |
1 | 任意 | 小 | 大 | O1 < O2 |
对于有符号数
CF | SF | 操作数1 | 操作数2 | 结果 |
---|---|---|---|---|
0 | 0 | 大 | 小 | O1 > O2 |
0 | 1 | 小 | 大 | O1 < O2 |
1 | 1 | 小 | 大 | O1 < O2 |
1 | 0 | 大 | 小 | O1 > O2 |
总结
OF ^ SF | 操作数1 | 操作数2 | 结果 |
---|---|---|---|
0 | 大 | 小 | O1 > O2 |
1 | 小 | 大 | O1 < O2 |
9. 乘法指令
单操作数指令, 操作数不能是立即数, 必须指定字长
1. 无符号数乘法
MUL O
功能:
8位: O × AL 结果存入 AX
16位: O × AX 结果存入 DX:AX (DX存高16位, AX存低16位)
操作数可以是寄存器或存储器, 不能为立即数
2. 有符号数乘法
IMUL O
功能:
8位: O × AL 结果存入 AX
16位: O × AX 结果存入 DX:AX (DX存高16位, AX存低16位)
操作数可以是寄存器或存储器, 不能为立即数
10. 除法指令
1. 无符号数除法
DIV O
功能:
8位: AL 中存放 AX ÷ O, AH 中存放 AX % O (取余)
16位: AX 中存放 DX:AX ÷ O, AX 中存放 DX:AX % O (取余)
操作数可以是寄存器或存储器, 不能为立即数
2. 有符号数除法
IDIV O
功能:
8位: AL 中存放 AX ÷ O, AH 中存放 AX % O (取余)
16位: AX 中存放 DX:AX ÷ O, AX 中存放 DX:AX % O (取余)
商和余数都带符号, 余数的符号与被除数符号相同
操作数可以是寄存器或存储器, 不能为立即数
以上是关于8086指令系统 算数运算指令的主要内容,如果未能解决你的问题,请参考以下文章