算术运算类指令

二、算术运算类指令

算术运算类指令共有24条,其中包括4种基本的算术运算指令,即加、减、乘、除。这4种指令能对8位无符号数进行直接运算,在借助溢出标志时还能对带符号的2进制整数进行加减运算。同时借助进位标志可以实现多精度数的加减和循环移位,也可以对压缩BCD码进行运算(压缩BCD码是指在一个字节中存放两个BCD码)。

大部分算术运算指令对程序状态字PSW中的CY、AC、OV三个标志位都有影响,根据运算的结果可将它们置1或清0。但是加1和减1指令不影响这些标志。算术运算类指令用到的助记符有:ADD、ADDC、SUBB、INC、DEC、DA、MUL和DIV 8种,见表3-4。

1.不带进位加法指令(ADD)(第1~第4条)

这4条指令的功能是把A中的数与源操作数相加,其结果仍存在A中。相加过程中若D3位或D7位有进位,则将辅助进位标志AC或进位标志CY置位,否则清0。对于无符号数相加时,若CY置位时,说明其和大于255。

对于有符号数相加,溢出标志位OV置位,说明和产生了溢出(即结果超出8位有符号数补码的表示范围-128~+127,破坏了符号位)。溢出可以通过双高位判别法来判别,溢出表达式OV=Cp⊕Cs,其中Cp为位6向位7的进位,Cs为位7向CY的进位。

【例3-14】设A=85H(即-123),R1=0FEH(即-2),求两数之和,并说明PSW中的有关标志位的内容。

指令:  ADD  A,R1

说明:

表3-4 MCS-51算术运算指令表

OV=Cp⊕Cs=1⊕1=0,说明和不产生溢出[(-123)+(-2)=(-125),不超出-128~+127范围],A中的和结果正确;PSW的CY=1,AC=1。

【例3-15】设A=0A5 H(即-91),R1=30 H,(30H)=0BEH(即-66),求两数之和。

指令:  ADD  A,@R1

说明:

OV=Cp⊕Cs=0⊕1=1,说明和产生溢出[(-91)+(-66)=(-157),超出-128~+127范围],A中的和结果不正确;PSW的CY=1,AC=1。

2.带进位加法指令(ADDC)(第5~第8条)

这4条指令的功能是把源操作数和A中的内容及进位标志CY相加,结果存入A中。

运算结果对PSW中相关位的影响同上述4条不带进位加法指令。

带进位加法指令一般用于多字节数的加法运算,低字节相加时和可能产生进位,可以通过带进位加法指令将低字节的进位加到高字节上去。高字节求和时必须使用带进位的加法指令。

【例3-16】设A=78H(即+120),(60H)=0CFH(即-49),CY=1,求两数之和并说明PSW中相关位的内容。

指令:  ADDC  A,60H

说明:

OV=Cp⊕Cs=1⊕1=0,说明和不产生溢出;PSW中的CY=1,AC=1。

3.带进位减法指令(SUBB)(第9~第12条)

这4条指令的功能是把A中的内容减去源操作数和进位标志,差存入A中。两数相减时,如果位7有借位,CY置1,否则清0。若位3有借位,则AC置1,否则清0。计算机中的减法运算实际上是变成补码相加。

【例3-17】已知A=88 H(即-120),R3=69 H(即+105),CY=0,计算两数相减的结果,并说明PSW中相关位的内容。

指令:  SUBB  A,R3

结果:A=1FH,CY=1,OV=1⊕0=1,说明结果产生了溢出。

4.加1指令(INC)(第13~第17条)

这一组指令的功能是将操作数所指定的单元或寄存器中的内容加1。其结果还送回原操作数单元或寄存器中。若原来为0FFH,加1后将溢出为00H。

对于第四条指令,若直接地址是I/O端口,则进行读、修改、写操作。其功能是先读入端口锁存器的内容,随后将其加1,然后再写到端口锁存器内。

第五条指令是唯一的一条16位数加1指令。

5.减1指令(DEC)(第18~第21条)

这组指令的功能是将操作数所指定的单元或寄存器中的内容减1,其结果还送回原操作数单元或寄存器中。若原来为00H,减1后将溢出为0FFH。

6.乘法指令(MUL)(第22条)

此条指令的功能是实现两个8位无符号数的乘法操作,两个数分别存在累加器A和寄存器B中。乘积为16位,低8位在A中,高8位在B中。若积大于255(0FFH),溢出标志位OV置位,否则复位,而CY位总是为0。乘法指令是整个指令系统中执行时间最长的2条指令之一,它需4个机器周期(48个振荡周期)才能完成一次乘法操作。

【例3-18】已知A=0A0H,B=08H。执行指令:

MUL  AB

执行结果是:A=00 H,B=05 H,即乘积为500 H,OV=1。

7.除法指令(DIV)(第23条)

DIV  AB  ;A←A/B(商),B←A/B(余)

除法指令实现两个8位无符号数除法,被除数放在A中,除数放在B中。指令执行后,商放在A中而余数在B中。

进位标志CY和溢出标志OV均清0,只有当除数为0时,A和B中的内容为不确定值,此时OV位置位,说明除法溢出。指令执行时间和乘法指令执行时间相同,也需4个机器周期。

【例3-19】设A=0AEH,B=08 H。执行指令:

DIV  AB

结果是:A=15 H,B=06H,OV=0。

8.十进制调整指令(DA)(第24条)

DA  A

BCD码是一种二进制形式的十进制码。它用4位二进制数表示一位十进制数。4位二进制数有16种状态,对应16个数字,而十进制数只用其中的0000~1001这10种,表示0~9。计算机在进行用BCD码表示的十进制数算术运算时,仍然是按二进制规则进行的。因此,就可能导致错误的结果。

这条指令是在进行压缩BCD码加法运算时,用来对压缩BCD码的加法运算结果自动进行修正。值得注意的是,对压缩BCD码的减法运算不能直接用此指令来进行修正。

例如:7+8的十进制运算结果为15,二进制运算如下:

从上式可见第一次得到的1111不是BCD码,进行+6修正后,得到结果10101(即15)为正确的压缩BCD码。由此可知,两个BCD码进行加法运算时,必须对结果进行修正才能得到正确的BCD结果。而DA A指令正是为完成此功能而设置的10进制数调整指令,调整规则如下:

若(A0~A3)>9或AC=1,则(A0~A3)+6→A0~A3。

同时,若(A4~A7)>9或CY=1,则(A4~A7)+6→A4~A7。

DA A指令使用时一般跟在ADD和ADDC指令之后,用来对加法和进行修正,CPU根据累加器A的原始数值和PSW的状态,由硬件自动对累加器进行加06H、60H或66H的操作。

【例3-20】78+54。

完成上例两数相加的指令如下:

MOV A,#78

ADD A,#54

DA A  ;执行此指令时,对高4位和低4位分别+6修正

执行结果:A=32H,CY=1,OV=0。