算术运算类指令主要完成加、减、乘、除四则运算,以及加1、减1和BCD码的运算、调整等。除加1、减1运算外,这类指令大多数都要影响到程序状态字寄存器PSW。虽然算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志CY,可进行多字节无符号整数的运算;利用溢出标志,还可方便地对带符号数进行补码运算。算术运算类指令用到的助记符有:ADD、ADDC、SUBB、INC、DEC、DA、MUL和DIV八种。
1.加法指令(4条)
ADD A,#data ;A←(A)+data
ADD A,direct ;A←(A)+(direct)
ADD A,@Ri ;A←(A)+((Ri))
ADD A,Rn ;A←(A)+(Rn)
以上指令把立即数、直接地址、间接地址以及工作寄存器的内容与累加器A中内容相加,结果送入A中。
【例3.8】(A)=0C3H,(R0)=0AAH,执行ADD A,R0指令,则操作如下:
运算后,CY=1,OV=1,AC=0,P=1,A=6DH。
上例中若C3H和AAH看作无符号数相加,则不考虑溢出,结果为16DH;若把C3H和AAH看作有符号数,则得到2个负数相加得正数的错误结论,此时OV=1,表示出错。
2.带进位加法指令(4条)
ADDC A,#data ;A←(A)+data+CY
ADDC A,direct ;A←(A)+(direct)+CY
ADDC A,@Ri ;A←(A)+((Ri))+CY
ADDC A,Rn ;A←(A)+(Rn)+CY
以上指令除了需考虑进位位外,和前面的一般加法指令完全相同。
【例3.9】A=0AEH,R0=81H,CY=1,执行ADDC A,R0指令,则操作如下:
运算后,CY=1,OV=1,AC=1,P=0,A=30H。
【例3.10】利用ADDC指令进行双字节加法运算。
设在双字节加法运算中,被加数存放在30H、31H单元,加数存放在40H、41H单元,和存放到50H、51H单元,编程如下:
MOV A,30H ;取低字节被加数
ADD A,40H ;低位字节相加
MOV 50H,A ;结果送50H单元
MOV A,31H ;取高字节被加数
ADDC A,41H ;加高字节和低位来的进位
MOV 51H,A ;结果送51H单元
3.带借位减法指令(4条)
SUBB A,#data ;A←(A)-data-CY
SUBB A,direct ;A←(A)-(direct)-CY
SUBB A,@R i;A←(A)-((Ri))-CY
SUBB A,Rn ;A←(A)-(Rn)-CY
以上指令把立即数、直接地址、间接地址以及工作寄存器的内容和借位位CY与累加器A中内容相减,结果送入累加器A中。
OV=1表示带符号数相减时,从一个正数中减去一个负数结果为负数,或从一个负数中减去一个正数结果为正数的错误情况。
【例3.11】(A)=C9H,(R3)=54H,CY=1,执行指令SUBB A,R3,则操作如下:
运算后,CY=0,AC=0,OV=1,P=0,A=74H。
注意:在进行单字节或多字节减法的低位运算前,要保证借位标志位CY的值为0,故在进行运算前要对CY清0。
【例3.12】利用SUBB指令进行双字节的减法运算。
设被减数存放在30H、31H单元中,减数存放在40H、41H单元中,差存在50H、51H单元中。编程如下:
MOV A,30H ;被减数低字节送A
CLR C ;低字节减无借位CY清0
SUBB A,40H ;低位字节相减
MOV 50H,A ;结果送50H单元
MOV A,31H ;被减数高字节送A
SUBB A,41H ;高字节相减
MOV 51H,A ;结果送51H单元
4.乘法指令(1条)
MUL AB ;BA←A×B(https://www.xing528.com)
这条指令的功能是将累加器A和寄存器B中的8位无符号整数相乘,所得16位乘积的低8位存放在A中,高8位存放在B中。若乘积大于FFH,则溢出标志OV为1,否则为0,乘法运算总使进位标志CY=0。
【例3.13】(A)=4EH,(B)=5DH,执行MUL AB指令,则结果如下:
A=55H,B=1CH,OV=1,P=0
【例3.14】利用乘法指令编写15H×33H的程序,将乘积的高8位存入31H单元,低8位存入30H单元。编程如下:
MOV A,#15H ;被乘数送A
MOV B,#33H ;乘数送B
MUL AB ;相乘
MOV 30H,A ;积的低8位送30H
MOV 31H,B ;积的高8位送31H
5.除法指令(1条)
DIV AB ;A←A/B的商,B←余数
这条指令的功能把累加器A中的8位无符号整数除以寄存器B中8位无符号整数,所得商送入A中,余数送入B中。除法运算总使CY和OV清0。
若除数(B中内容)为00H,则执行结果为不定值,此时OV=1,表示除法溢出。
【例3.15】(A)=87H,(B)=0CH,执行DIV AB指令,则结果如下所示:
(A)=0BH,(B)=03H,OV=0,CY=0
6.加1指令(5条)
INC A ;A←(A)+1
INC direct ;direct←(direct)+1
INC @Ri ;((Ri))←((Ri))+1
INC Rn ;Rn←(Rn)+1
INC DPTR ;DPTR←(DPTR)+1
INC指令是把所指定寄存器或存储单元的内容加1,结果仍送回原寄存器或存储单元,且运算结果不影响任何标志位。若原来的内容为0FFH,则加1后将为00H。该组指令使用了直接、寄存器、寄存器间接寻址方式。
在第二条指令中,若直接地址是I/O口,则进行“读-改-写”操作。其功能是先读入端口锁存器的内容,然后在CPU中加1,继而再输出到该端口。
7.减1指令(4条)
DEC A ;A←(A)-1
DEC direct ;direct←(direct)-1
DEC @Ri ;((Ri))←((Ri))-1
DEC Rn ;Rn←(Rn)-1
DEC指令把所指定寄存器或存储单元的内容减1,结果仍送回原寄存器或存储单元,若原来的内容为00H,则减1后将为0FFH,运算结果不影响任何标志位,该组指令使用了直接、寄存器和寄存器间接寻址。
同INC指令一样,在第二条指令中,若直接地址是I/O口,则同样是进行“读-改-写”操作。
8.十进制(BCD码)调整指令(1条)
DA A
这条指令是在进行BCD码运算时,跟在ADD和ADDC指令之后,将相加后存放在累加器A中的结果进行调整修正。
修正的条件和方法为:
若(A0~3)>9或(AC)=1,则(A0~3)←(A0~3)+06H
若(A4~7)>9或(CY)=1,则(A4~7)←(A4~7)+60H
若以上两条同时发生,或高4位虽等于9,但低4位修正后有进位,则应加66H调整。
以上讨论的调整情况是由ALU硬件中的十进制修正电路自动进行的,用户不必考虑何时加“6”,使用时只需在ADD和ADDC后面紧跟一条DA A指令即可。
【例3.16】利用十进制加法调整指令作十进制减法运算(应采用补码相加的方法,用9AH减去减数即得以10为模的减数补码)。
设被减数存放在30H单元,减数存放在40H单元,结果存放在50H单元,编程如下:
CLR C ;清进位位
MOV A,#9AH ;求减数补码
SUBB A,40H
ADD A,30H ;与补码相加
DA A ;十进制调整
MOV 50H,A ;结果存放在50H单元
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
