8086指令系统(二) 算数运算指令

书读的越多而不加思考,你就会觉得你知道得很多;而当你读书而思考得越多的时候,你就会越清楚地看到,你知道得很少。

导读:本篇文章讲解 8086指令系统(二) 算数运算指令,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

算数运算指令

指令 作用
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位:AL 中存放 AX ÷ O, AH 中存放 AX % O (取余)
DIV OPRD 16位:AX 中存放 DX:AX ÷ O, DX 中存放 DX:AX % O (取余)
IDIV OPRD 8位:AL 中存放 AX ÷ O, AH 中存放 AX % O (取余)
IDIV OPRD 16位:AX 中存放 DX:AX ÷ O, DX 中存放 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, DX 中存放 DX:AX % O (取余)

操作数可以是寄存器或存储器, 不能为立即数

2. 有符号数除法

IDIV O

功能:
  8位: AL 中存放 AX ÷ O, AH 中存放 AX % O (取余)
  16位: AX 中存放 DX:AX ÷ O, DX 中存放 DX:AX % O (取余)

商和余数都带符号, 余数的符号与被除数符号相同

操作数可以是寄存器或存储器, 不能为立即数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122852.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!