8086指令系统 算数运算指令

Posted _DiMinisH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8086指令系统 算数运算指令相关的知识,希望对你有一定的参考价值。

算数运算指令

指令作用
ADD OPRD1, OPRD2OPRD1 <- OPRD1 + OPRD2
ADC OPRD1, OPRD2OPRD1 <- OPRD1 + OPRD2 + CF
INC OPRDOPRD <- OPRD + 1
INC BYTE PTR SEGMENT:[REG]将 内存中SEGMENT段的 以REG的内容为偏移地址+1 的单元 的数据 送回REG中
SUB OPRD1, OPRD2OPRD1 <- OPRD1 - OPRD2
SBB OPRD1, OPRD2OPRD1 <- OPRD1 - OPRD2 - CF
DEC OPRDOPRD <- OPRD - 1
DEC BYTE PTR SEGMENT:[REG]将 内存中SEGMENT段的 以REG的内容为偏移地址-1 的单元 的数据 送回REG中
NEG OPRDOPRD <- 0 - OPRD
CMP OPRD1, OPRD2OPRD1 - OPRD2
MUL OPRD8位:O × AL 结果存入 AX
MUL OPRD16位:O × AX 结果存入 DX:AX (DX存高16位, AX存低16位)
IMUL OPRD8位:O × AL 结果存入 AX
IMUL OPRD16位:O × AX 结果存入 DX:AX (DX存高16位, AX存低16位)
DIV OPRD8位:O × AL 结果存入 AX
DIV OPRD16位:AX 中存放 DX:AX ÷ O, AX 中存放 DX:AX % O (取余)
IDIV OPRD8位:O × AL 结果存入 AX
IDIV OPRD16位: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 ,结果不要了

对于无符号数

CFSF操作数1操作数2结果
0任意O1 > O2
1任意O1 < O2

对于有符号数

CFSF操作数1操作数2结果
00O1 > O2
01O1 < O2
11O1 < O2
10O1 > O2

总结

OF ^ SF操作数1操作数2结果
0O1 > O2
1O1 < 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指令系统 算数运算指令的主要内容,如果未能解决你的问题,请参考以下文章

8086算术运算类指令

转载移位指令

CPU的工作原理

指令系统-第三节2345:常用的x86汇编指令选择和循环语句的机器级表示

8086 汇编

8086/8088的指令都有哪些寻址方式