计组(day3)8086指令系统——算术运算指令(加减指令)

1. 加法运算指令

加法指令对双操作数的要求与MOV指令基本相同,但有一点:段寄存器不能作为加法指令的操作数。

1.1 普通加法指令ADD

指令格式: ADD OPRD1,OPRD2              ;OPRD1<—OPRD1+OPRD2
按操作数分,其指令格式分为

  1. ADD acc,data
  2. ADD mem/reg,data
  3. ADD mem/reg,mem/reg

注意:

  1. 源和目的操作数不能同时为存储器操作数
  2. 不能把段寄存器作为操作数

功能: 将源操作数和目标操作数相加,结果送回目标地址中。
示例:
合法的示例:

ADD CL,20H					; CL <—— CL + 20H     目的操作数的寻址方式是寄存器寻址,源操作数是立即寻址
ADD DX,[BX+SI]				; DX <—— DX + [BX+SI] 目的操作数的寻址方式是寄存器寻址,源操作数是存储器的基址加变址寻址

非法的示例:

ADD [SI],[BX]				;不允许两个操作数都是存储器操作数
ADD DS,AX					;不允许把段寄存器作为操作数

对状态标志位的影响: 对全部6个状态标志位都会产生影响。

1.2 带进位加法指令ADC

指令格式: ADC OPRD1,OPRD2             ;OPRD1<—OPRD1+OPRD2+CF
按操作数分,其指令格式分为

  1. ADC acc,data
  2. ADC mem/reg,data
  3. ADC mem/reg,mem/reg

ADC与ADD指令在功能、格式及对标志位的影响上都基本相同,只是相加时要包括进位CF的内容。

功能: 主要用于多字节运算。由于8086一次最多只能实现两个16位数相加,故对多于两个字节的数的加法,只能先加低16位(或低8位),再加高16位(或高8位),但在高位相加时,必须要考虑低位向上的进位,这时就需使用ADC指令。

对状态标志位的影响: 对全部6个状态标志位都会产生影响。

思考:两个四字节的无符号数相加,0107A379H + 10067E4FH = ?

1.3 加1指令INC

指令格式: INC OPRD             ;OPRD <— OPRD + 1
按操作数分,其指令格式分为:

  1. INC mem/reg

功能: 将指定操作数的内容加1,通常用于在循环程序中修改地址及循环次数等。
注意: OPRD不能是段寄存器,也不能是立即数。
对状态标志位的影响: 不影响CF标志位,但对其他5个状态标志AF、OF、PF、SF及ZF会产生影响。

2. 减法指令

2.1 不考虑借位的减法指令SUB

指令格式: SUB OPRD1,OPRD2             ;OPRD1<—OPRD1-OPRD2
按操作数分,其指令格式分为:

  1. SUB acc,data
  2. SUB mem/reg,data
  3. SUB mem/reg,mem/reg

功能: 用目标操作数减去源操作数,并将结果送目标操作数所在地址中。
比较: 对操作数的要求以及对状态标志位的影响与ADD指令完全相同。

2.2 考虑借位的减法指令SBB

指令格式: SUB OPRD1,OPRD2             ;OPRD1<—OPRD1-OPRD2-CF
按操作数分,其指令格式分为:

  1. SBB acc,data
  2. SBB mem/reg,data
  3. SBB mem/reg,mem/reg

功能: 用目标操作数减去源操作数以及标志位CF的值,并将结果送目标操作数所在地址中。
比较: 对操作数的要求以及对状态标志位的影响与ADC指令完全相同。

2.3 减1指令DEC

指令格式: DEC OPRD             ;OPRD <— OPRD - 1
按操作数分,其指令格式分为:

  1. DEC mem/reg

功能: 一条单字节指令,将操作数的值减1,再送回该操作数所在地址。
比较: 对操作数的要求以及对状态标志位的影响与INC指令完全相同。
思考:编写一个延时指令。

2.4 求补指令NEG

指令格式: NEG OPRD             ;OPRD<— 0 - OPRD
按操作数分,其指令格式分为:

  1. NEG mem/reg

功能: 由于对一个操作数取补码等于用0减去此操作数,故利用NEG可以得到负数的绝对值。(需要花点时间理解)
示例:设AL=FFH,执行指令NEG AL后,AL=0-FFH=01H,即实现了对FFH(-1的补码)求补,或者说得到了AL中负数的绝对值。

注意:

  1. 执行NEG指令后,一般情况下都会使CF为1。(思考:为什么?,当操作数为哪个特例时?CF为0)
  2. 当指定的操作数的值为80H(-128)或为8000H(-32768),则执行结果不变。(思考:为什么?,OF标志位较其他情况有没有不同?)

2.5 比较指令CMP

指令格式: CMP OPRD1,OPRD2             ;OPRD1-OPRD2,结果返回到标志位上。
功能: 比较两个操作数谁大谁小,或是相等。一般会在比较指令之后都紧跟一个条件转移指令,根据比较结果决定程序的转向。
判断方法:

  1. 相等关系。 ZF = 1
  2. 大小关系。分无符号位和有符号位两种。
    此时ZF=0,分两种情况
    1)比较的是两个无符号数
          若CF = 0,则 OPRD1 > OPRD2
          若CF = 1,则 OPRD1 < OPRD2
  1. 比较的是两个有符号数
          若OF⊕SF=0,则 OPRD1 > OPRD2
          若OF⊕SF=1,则 OPRD1 < OPRD2

比较: 对操作数的要求以及对状态标志位的影响与SUB指令完全相同。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值