首页 理论教育单片机算术运算指令-单片机基础及应用

单片机算术运算指令-单片机基础及应用

【摘要】:MCS-51单片机的算术运算类指令包括加、减、乘、除、加1、减1等指令。这类指令有ADD、ADDC、INC、SUBB、DEC、DA、MUL、DIV共8种。表3-3算术运算类指令注:√表示该指令影响某一标志位。运算结果对PSW的影响同上述4条ADD指令。6.十进制调整指令十进制调整指令只有以下1条:该指令用于BCD码加法运算时,对BCD码的加法运算结果自动进行调整,但对BCD码的减法运算不能用此指令来调整。在运算过程中,单片机按二进制规则进行运算。

MCS-51单片机的算术运算类指令包括加、减、乘、除、加1、减1等指令。这类指令大都影响标志位。这类指令有ADD、ADDC、INC、SUBB、DEC、DA、MUL、DIV共8种。算术运算类指令如表3-3所示。

表3-3 算术运算类指令

注:√表示该指令影响某一标志位。

1.不带进位的加法指令

不带进位的加法指令共有以下4条:

这组指令的一个加数总是累加器A,采用立即数、直接地址、间接地址以及寄存器寻址方式将其内容与累加器(A)内容相加,结果送入累加器(A)中。如果运算结果的最高位D7有进位输出,则将进位标志位(CY)置1,否则将CY清0;如果D3有进位输出,将辅助进位标志位(AC)置1,否则将AC清0。如果D6有进位而D7没有或者D7有进位D6没有,将溢出标志位(OV)置1,否则将(OV)清0;奇偶标志位(P)将随累加器(A)中1的个数而变化。

例如,若已知(A)=0C3H,(R0)=0AAH,执行指令

后结果为:(A)=6DH。标志位为:AC=0,CY=1,OV=1,P=1。

运算过程如下:

2.带进位的加法指令

带进位的加法指令共有以下4条:

这4条指令的功能是将源操作数所指示的内容和累加器(A)中的内容及进位位(CY)相加,结果存入累加器(A)中。运算结果对PSW的影响同上述4条ADD指令。

例如,若(A)=85H,(20H)=6DH,CY=1,执行指令

后结果为:(A)=0F3H。标志位为:CY=0,OV=0,AC=1,P=0。

运算过程如下:

3.带借位的减法指令

带借位的减法指令共有以下4条:这4条指令的功能是把累加器(A)中的内容减去源操作数所指示的内容及进位CY,将差存入累加器(A)中。如果运算结果的最高位D7有借位输出,则将进位标志位(CY)置1,否则将CY清0;如果D3有借位输出,将辅助进位标志位(AC)置1,否则将AC清0。如果D6有借位而D7没有或者D7有借位而D6没有,将溢出标志位(OV)置1,否则将(OV)清0;奇偶标志位(P)将随累加器(A)中1的个数而变化。

例如,若(A)=0C9H,(R2)=54H,CY=1,执行指令

后结果为:(A)=74H。标志位为:CY=0,OV=1,AC=0,P=0。

运算过程如下:

4.增量(加1)指令

增量(加1)指令共有以下5条:

增量(加1)指令的功能是将指定单元的内容加1再送回该单元。即使加1溢出时也不进位CY。需要注意的是,INC direct指令中,direct为I/O端口(即地址为80H、90H、0A0H、0B0H)时,则CPU进行“读—修改—写”操作,其功能是先读入端口锁存器的内容,然后加1,继而输出到端口。

例如,若已知(A)=0FFH,(R3)=0FH,(30H)=0F1H,(R0)=40H,(40H)=01H,(DPTR)=1234H,执行指令

后结果为:(A)=00H,(R3)=10H,(30H)=0F2H,(40H)=02H,(DPTR)=1235H。

5.减量(减1)指令

减量(减1)指令共有以下4条:

(www.chuimin.cn)

减量(减1)指令的功能是将指定单元的内容减1再送回该单元。需要注意的是,没有操作数为DPTR的减1指令。同样,在指令DEC direct中,direct为I/O端口时同INC direct指令,这里不再赘述。

例如,若已知(A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,执行指令

后结果为:(A)=0EH,(R7)=18H,(30H)=0FFH,(40H)=0FEH,PSW中仅P位改变。

6.十进制调整指令

十进制调整指令只有以下1条:

该指令用于BCD码加法运算时,对BCD码的加法运算结果自动进行调整,但对BCD码的减法运算不能用此指令来调整(只用于加法,跟在加法指令后面,减法不适用)。调整的目的在于单片机中,十进制数字0~9一般可用BCD码表示,它是以4位二进制编码的形式出现的。在运算过程中,单片机按二进制规则进行运算。但因为对于4位二进制数可有16种状态,从0000~1111,运算时逢16进位,而对于十进制数只有10种状态,从0000~1001,运算时逢10进位。这样,十进制BCD码按二进制规则运算时,其结果就可能不正确,必须进行调整,以使运算的结果恢复为十进制数。其调整过程如图3-9所示。

例如,设(A)=57H,(R5)=66H,执行指令

图3-9 DA A指令调整过程示意图

后结果为:(A)=23H,CY=1。

7.乘法指令

乘法指令只有以下1条:

该指令用于实现两个8位无符号数的乘法操作。两个无符号数分别存放在A和B中,乘积为16位,积的低8位存于A中,积的高8位存于B中。如果积大于255,即B不为0,则OV置1,否则OV清0,该指令执行后,CY总是清0。

例如,设(A)=50H,(B)=0A0H,执行指令

后结果为:(B)=32H,(A)=00H(即积为3200H),OV=1,CY=0。

8.除法指令

除法指令只有以下1条:

该指令实现两个8位无符号数的除法操作。一般被除数放在A中,除数放在B中,指令执行后,商放在A中,余数放在B中,进位CY和溢出标志位OV均清0。只有当除数为0时,A和B的内容为不确定值,此时OV置位,说明除法溢出。

乘法指令和除法指令是MCS-51指令系统中执行时间最长的指令,需要4个机器周期。

例如,设(A)=0FBH,(B)=12H,执行指令

后结果为:(A)=0DH,(B)=11H,OV=0,CY=0。

【例3-9】试编写计算1234H+5678H的程序,将和的高位存入41H,低8位存入40H。

【程序】

【例3-10】编写6位BCD码加法运算程序,设被加数存入片内RAM3 0H~32H单元中,加数存入片内RAM 40H~42H中,低位在前,高位在后,各单元中均为压缩的BCD码。将结果之和分别存入50H~52H单元中。

【程序】

【例3-11】试编程把A的二进制数转换成3位BCD码,百位数放在20H,十位、个位数放在21H中。

【编程说明】先对要转换的一进制数除以100,商数即为百位数,余数部分再除以10,商数余数分别为十位、个位数,它们在A、B的低4位,通过SWAP、ADD组合成一个压缩的BCD数,使十位数放在A7~4,个位数放在A3~0

【程序】