8086CPU指令系统——算术运算类指令

算数运算(Arithmetic)类指令涉及的操作数的长度由 8 位和 16位。这些操作数分为两种类型的数据,即无符号数和有符号数。
(1)8位无符号数范围:0~255(2^n-1)
(2)8位有符号数范围:-128~127
(3)16位无符号数范围:0~65535
(4)16位有符号数范围:-32768~+32767

在这里插入图片描述
既实现对无符号数的运算,又实现对有符号数运算,对加减法来说,可以采用同一套指令,而对乘除法来说,则不能采用同一套指令。

注意:除了 INC/DEC 指令不影响进位标志 CF 外,其它算术运算指令对 OF、SF、ZF、AF、PF、CF 均会产生影响。

  1. 当无符号数运算产生溢出时, CF 为 1。
  2. 当有符号数运算产生溢出时, OF 为 1。OF 是运算结果最高位产生的进位(或借位)按异或运算确定,称为双高位判断。
  3. 如果运算结果为 0,则 ZF = 1。
  4. 如果运算结果最高位为 1,则 SF = 1。
  5. 如果运算结果中有偶数个 1,则 PF = 1。

一、加法指令ADD、ADC、INC

1、不带进位加法指令ADD(addition)
指令格式:ADD dst, src
执行操作:dst<——dst+src
标志位:根据结果,自动置位/复位 OF、SF、ZF、AF、PF、CF。
指令功能:指令ADD的功能是将目的操作数 dst 与源操作数 src 相加,结果送回目的操作数。
ADD指令的操作数搭配共有6种方式:

ADD reg, mem/reg/segreg/data
ADD mem, reg/data

2、带进位加法ADC
指令格式:ADC dst, src
执行操作:dst<——dst+src+CF
标志位:根据结果,自动置位/复位 OF、SF、ZF、AF、PF、CF。
指令功能:只是在两个操作数相加时,要将 CF 的当前值加上去。ADC 指令的操作数搭配共有 6 种格式,与 ADD 指令相同。
ADC指令主要用于多字节运算。为扩大数据范围,仍然需要多字节运算。

3、增量指令INC(Increment)
指令格式:INC dst
执行操作:dst<——dst+1
标志位:只影响状态标志 OF、SF、ZF、AF、PF,不影响 CF 标志。
指令功能:INC指令的功能将指定的操作内容加上 1,再送回操作数。

二、减法指令 SUB、SBB、DEC、NEG、CMP

1、不带借位的减法指令SUB(subtraction)
指令格式:SUB dst, src
执行操作:dst<——dst-src
标志位:根据结果,自动置位/复位 OF、SF、ZF、AF、PF、CF。
指令功能:将目的操作数与源操作数相减,结果返回目的操作数。
SUB指令的操作数搭配共有6种方式:

SUB reg, mem/reg/segreg/data
SUB mem, reg/data

2、带借位的减法指令SBB(subtract with borrow)
指令格式:SBB dst, src
执行操作:dst<——dst-src-CF
标志位:根据结果,自动置位/复位 OF、SF、ZF、AF、PF、CF。
指令功能:SBB指令格式和SUB一样,只是在两个操作数相减时,还要减去错位标志CF的现行值,结果送往目的操作数。

3、减量指令DEC(decrement)
指令格式:DEC dst
执行操作:dst<——dst-1
标志位:只影响状态标志 OF、SF、ZF、AF、PF,不影响 CF 标志。
指令功能:将指定寄存器或存储单元的内容减1。

4、取补指令NEC(negate)
指令格式:NEG dst
执行操作:dst<——0-dst
标志位:根据结果,自动置位/复位 OF、SF、ZF、AF、PF、CF。
指令功能:该指令执行结果总是使 CF=1;除非在操作数位为 0时,才使 CF=0。
因为此操作是用0去减操作数,故只有对0求补时,CF=0,其余情况都使CF=1。
操作数是-128(80H)或-32768(8000H)时,结果不变,但OF=1。

5、比较指令CMP(compare)
指令格式:CMP dst, src
执行操作:dst-src
标志位:根据结果,自动置位/复位 OF、SF、ZF、AF、PF、CF。
指令功能:该指令将两个操作数相减,但结果不会送回到目的操作数。CMP搭配方式与SUB一样。

根据CMP指令的特点,可根据A-B的标志位,判断A与B的大小。
(1)对于无符号数

ZF=1:A=B
ZF=0:CF=0:A>B
      CF=1:A<B

(2)对于有符号数

①当A和B正负性相同时:仅由SF判断A、B的大小,此时不会发生溢出OF=0
	SF=1,A<B
	SF=0,A>B 
②当A和B的正负性不相同时:此时发生溢出OF=1
	如果OF ⊕ SF=0(CF=SF),则A>B
	如果OF ⊕ SF=1(CF!=SF),则A<B

三、乘法指令MUL、IMUL

二进制乘法特点:
两个8位数相乘,结果为16位数。
两个16位数相乘,结果为32位数。

8086乘法指令特点:
一个乘数总是放在AL(8位)或AX(16位)中;
将DX看成是AX的扩展。

1、无符号乘法指令MUL(multiplication)
指令格式:MUL src
执行操作:
字节操作——src为字节,(AX)<——(AL)xsrc
字操作——src为一个字,(DX, AX)<——(AX)xsrc
标志位:乘法指令对 CF 和 OF有定义,对其他标志位的状态不定。
当乘积的高半部分为1:CF=OF=1,代表乘积的长度扩展
当乘积的高半部分为0:CF=OF=0,代表乘积的长度没有扩展

在这里插入图片描述
2、有符号数的乘法指令IMUL(integer multiplication)

指令格式:IMUL src
执行操作:
字节操作——src为字节,(AX)<——(AL)x src
字操作——src为一个字,(DX, AX)<——(AX)x src
标志位:乘法指令对 CF 和 OF有定义,对其他标志位的状态不定。
IMUL指令要求两个乘数都为有符号数(补码),且乘积也是补码表示。

四、除法指令DIV、IDIV、CBW、CWD

在除法运算中,如果除数是 8 位的,这要求被除数是 16 位;如果除数是 16 位的,这要求被除数是 32 位。

1、无符号数的除法指令DIV(division)
格 式: DIV src
执行操作:
字节除: AX/src,(AL)<——商, (AH) <——余数
字除: (DX,AX)/src,(AX) <——商,(DX) <——余数
标志位:除法指令对标志位的状态均无定义。
注意:被除数在累加器中,且必须是除数的两倍字长。
在这里插入图片描述

2、有符号数的除法指令IDIV(integer division)
格 式: DIV src
执行操作:
字节除: AX/src,(AL)<——商, (AH) <——余数
字除: (DX,AX)/src,(AX) <——商,(DX) <——余数
标志位:除法指令对标志位的状态均无定义。

IDIV指令要求两个数都为有符号数(补码),商和余数也是补码表示。

3、字节扩展为字指令CBW(convert byte to word)
指令格式:CBW
执行操作:若(AL)<80H,(AH)<——0;若(AL)>80H,(AH)<——0FFH
标志位:无影响
指令功能:把 AL 中的字符扩展到AH中。

4、字扩展为双字指令CWD(convert word to double word)
指令格式:CWD
执行操作:若(AX)<8000H,(DX)<——0;若(AL)>8000H,(DX)<——0FFFFH
标志位:无影响
指令功能:把 AX 中的字符扩展到DX中。

通俗的讲,就是看最高位,如果是0就全补0,如果是1就全补1。
CBW和CWD指令常用于在两数相处之前,使被除数进行扩展。

五、BCD码调整指令AAA、DAA、AAS、DAS、AAM、AAD

压缩BCD码:四个二进制表示0-9,一个字节表示范围0~99
1001——9
10010110——96

非压缩BCD码:八个二进制表示0-9,一个字节表示范围0~9
00001001——9

调整指令都采用隐含寻址方式——将AL或AX累加器作为隐含操作数。

1、加法的非压缩BCD码调整指令AAA
指令格式:AAA
执行操作:若AL低四位大于9(即16进制的A~F),或者AF=1,则(AL)<——((AL)+06H)&OFH,且(AH)<——(AH)+1,并使CF=AF=1;否则AL,AH值不变,且CF=AF=0。
标志位:影响CF和AF,但对OF、PF、ZF、SF未定义。
AAA跟在以AL为目的操作数的ADD或ADC指令之后,对AL进行非压缩BCD码调整

2、减法的非压缩BCD码调整指令AAS
指令格式:AAS
执行操作:若AL低四位大于9(即16进制的A~F),或者AF=1,则(AL)<——((AL)-06H)&OFH,且(AH)<——(AH)-1,并使CF=AF=1;否则AL,AH值不变,且CF=AF=0。
标志位:影响CF和AF,但对OF、PF、ZF、SF未定义。
AAS跟在以AL为目的操作数的SUB或SBB指令之后,对AL进行非压缩BCD码调整

3、加法的压缩BCD码调整指令DAA
指令格式:DAA
执行操作:
若AL低四位大于9(即16进制的A~F),或者AF=1,则(AL)<——(AL)+06H,AF=1;
若AL高四位大于9(即16进制的A~F),或者CF=1,则(AL)<——(AL)+60H,CF=1;
标志位:影响CF、AF、PF、ZF、SF,但对OF未定义。
DAA跟在以AL为目的操作数的ADD或ADC指令之后,对AL进行压缩BCD码调整,并在AL得到正确的压缩BCD码结果。

4、减法的压缩BCD码调整指令DAS
指令格式:DAS
执行操作:
若AL低四位大于9(即16进制的A~F),或者AF=1,则(AL)<——(AL)-06H,AF=1,否则AL不变,且CF=0;
若AL高四位大于9(即16进制的A~F),或者CF=1,则(AL)<——(AL)-60H,CF=1,否则AL不变,且CF=0;
标志位:影响CF、AF、PF、ZF、SF,但对OF未定义。
DAS跟在以AL为目的操作数的SUB或SBB指令之后,对AL进行压缩BCD码调整,并在AL得到正确的压缩BCD码结果。

5、乘法的非压缩BCD码调整指令AAM
指令格式:AAM
执行操作:(AX)/0AH, (AH)<——商,(AL)<——余数
标志位:影响PF、SF、ZF,但对OF、CF、AF未定义。

6、除法的非压缩BCD码调整指令AAD
指令格式:AAD
执行操作:(AL)<——(AH)x10+(AL), (AH)<——0
标志位:影响PF、SF、ZF,但对OF、CF、AF未定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值