首页 理论教育 单片机应用技术:算术运算类指令

单片机应用技术:算术运算类指令

时间:2026-01-26 理论教育 对我是小斗 版权反馈
【摘要】:算术运算类指令主要完成加、减、乘、除四则运算,以及加1、减1和BCD码的运算、调整等。算术运算类指令用到的助记符有:ADD、ADDC、SUBB、INC、DEC、DA、MUL和DIV八种。=0C3H,=0AAH,执行ADDA,R0指令,则操作如下:运算后,CY=1,OV=1,AC=0,P=1,A=6DH。利用SUBB指令进行双字节的减法运算。

算术运算类指令主要完成加、减、乘、除四则运算,以及加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单元

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈