首页 理论教育 算术运算类指令及要点分析-单片机原理与应用实例

算术运算类指令及要点分析-单片机原理与应用实例

时间:2023-10-22 理论教育 版权反馈
【摘要】:算术运算类指令共有24条,包括加减乘除四种基本的算术运算。算术运算类指令大部分会影响标志位,指令执行的结果将使进位、辅助进位、溢出三种标志位置位或复位。

算术运算类指令及要点分析-单片机原理与应用实例

算术运算类指令共有24条,包括加减乘除四种基本的算术运算。这类指令的作用为:

1)对8位的无符号数进行直接运算。

2)借助溢出标志,可对带符号数进行补码运算。

3)借助进位标志,可以实现多精度的加、减和环移。

4)借助十进制调整,可对压缩的BCD数进行运算。

5)多字节、多精度数的运算。

算术运算类指令大部分会影响标志位,指令执行的结果将使进位(Cy)、辅助进位(AC)、溢出(OV)三种标志位置位或复位。但是加1和减1指令不影响这些标志。

1.加法指令及要点分析

(1)加法指令指令介绍

978-7-111-46831-8-Chapter02-78.jpg

例如:A=3BH,PSW=0,执行指令ADD A,#3BH

求:A,Cy,OV,AC,P,PSW

解:978-7-111-46831-8-Chapter02-79.jpg

A=76H,Cy=0,OV=CP⊕CS=0,AC=1,P=1,PSW=01000001=41H

(2)加法指令要点分析

1)以上4条ADD指令的功能:把指令中指定的数据与累加器原来的内容相加,和存放在累加器中。

2)相加过程中若位7有进位,则进位标志Cy将置位,否则Cy=0;若位3有进位,则辅助进位标志AC将置位,否则AC=0;对于无符号数相加时,若Cy置位,说明和数溢出(即大于255)。

3)当位6和位7不同时有进位时,溢出标志OV将置位。利用OV可以判断带符号数相加时,和数是否溢出(即大于127或小于-128),溢出时运算结果是错误的。

例如:120与100之和为220,大于127,相加时位6有进位而位7无进位,OV=CP⊕CS=1。

978-7-111-46831-8-Chapter02-80.jpg

结果:-5CH=-92(错误)

符号位(位7)由0变1,结果变负,实际上它成为和数的最高位,符号位移入进位标志。

再看-120与-100之和,它们的补码分别为10001000B和10011100B,相加过程中位6无进位而位7有进位,OV=CP⊕CS=1。

978-7-111-46831-8-Chapter02-81.jpg

结果:+24H=+36(错误结果)

符号位由1变0,结果变正,这是因为符号位移入进位标志之故。在上述两种情况下,溢出标志OV将置位。因此在实行带符号数的加法运算时,OV是一个重要的辨别标志。

4)进位标志可用来判断无符号数的运算结果是否正确,还用来实现多字节数的运算;溢出标志主要用来判断带符号数的运算结果是否正确。

2.带进位加法指令及要点分析

(1)指令介绍

978-7-111-46831-8-Chapter02-82.jpg

例如:已知:A=9AH,R2=E3H,PSW=0,执行指令ADDC A,R2

求:A,Cy,OV,AC,P,PSW

解:978-7-111-46831-8-Chapter02-83.jpg

A=7DH,Cy=1,OV=CP⊕CS=1,AC=0,P=0,PSW=10000100=84H

(2)要点分析 由于MCS-51系列单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0~255,这在实际工作中是不够的,因此就要进行扩展,一般是将两个8位的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0~65535。

例如:设双字节数X存在片内RAM中41H、40H单元,Y存在42H、43H单元,如图2-25所示。编程求Z=X+Y,并存入片内RAM中44H、45H、46H单元。

程序如下:

978-7-111-46831-8-Chapter02-84.jpg

978-7-111-46831-8-Chapter02-85.jpg

图2-25 片内RAM存储示意图

3.加1指令及要点分析(www.xing528.com)

(1)指令介绍

978-7-111-46831-8-Chapter02-86.jpg

(2)要点分析 从结果上看“INC A”和“ADD A,#1”差不多,但“INC A”是单字节、单周期指令,而“ADD A,#1”是双字节、双周期指令,而且“INC A”不会影响PSW位,如A=0FFH,执行“INC A”后A=00H,Cy依然保持不变。如果是执行“ADD A,#1”,则A=00H,而Cy=1。因此加1指令并不适合做加法,事实上它主要是用来做计数、地址增加等。另外,加法类指令都是以A为核心的,其中一个数必须放在A中,运算结果也必须放在A中,而加1类指令的对象则广泛得多,可以是寄存器、内存地址、间接寻址的地址等。

4.带借位减法指令及要点分析

(1)指令介绍

978-7-111-46831-8-Chapter02-87.jpg

(2)要点分析

1)指令从累加器的内容中减去指定的一个字节和进位标志。

2)够减时,进位标志复位,不够减时,发生借位,进位标志置位。借助进位(用来指示有无借位)标志可以实现多精度减法。

3)当位3发生借位时,AC置位,否则AC复位。

4)当位6及位7不同时发生借位时,OV置位,否则OV复位。在作带符号数运算时,只有当符号不相同的两数相减时才会发生溢出,所以OV置位表示发生了正数减去负数差为负,或是负数减去正数差为正的情况,显然是不对的。

5)没有不带借位的减法指令,如果需要做不带借位的减法指令(在做第一次相减时),只要将Cy清零即可。

5.减1指令

978-7-111-46831-8-Chapter02-88.jpg

这组指令的功能是将指定单元的内容减1,结果仍在原单元中。指令执行结果不影响标志位。

6.乘法、除法指令及要点分析

(1)指令介绍

978-7-111-46831-8-Chapter02-89.jpg

(2)要点分析

1)MUL指令实现8位无符号数的乘法操作,两个乘数分别放在累加器A和寄存器B中,乘积为16位,低8位放在A中,高8位放在B中。DIV指令实现8位无符号数除法,被除数放在A中,除数放在B中,指令执行后,商放在A中而余数放在B中。

2)若积大于255,溢出标志置位,否则复位,进位标志总是复位;对DIV指令标志C和OV均复位,只有当除数为0时,A和B中的内容为不确定值,此时OV标志置位,说明除法溢出。

3)乘法、除法指令是整个指令系统中执行时间最长的两条指令,它们需要4个机器周期(48个振荡周期)完成一次操作,对于12MHz晶振的单片机,执行一次乘法操作的时间为4μs。

例如:把累加器A中的二进制数转换为3位BCD数的子程序。百位数放在HUND,十位、个位数放在TENONE中。HUND和TENONE为内部RAM的两个单元。

设A=0E5H=229 HUND TENONE

978-7-111-46831-8-Chapter02-90.jpg

二进制数向BCD数转换原理:229/100的商是2,余数29;29/10的商是2,余数9,合并2和9。

程序如下:

978-7-111-46831-8-Chapter02-91.jpg

7.十进制调整指令及要点分析

(1)指令介绍

978-7-111-46831-8-Chapter02-92.jpg

(2)要点分析

1)这条指令必须紧跟在ADD或ADDC指令之后,且这里的ADD或ADDC的操作是对压缩的BCD数进行运算。

2)DA指令不影响溢出标志。

3)不能用DA指令对十进制减法操作的结果进行调整。

4)借助进位标志可实现多位BCD数加1和减1。

例如:设一个加数存放在50H、51H单元,另一个加数存放在52H、53H单元。4位压缩的BCD数的相加,和数放到50H、51H单元。

即:978-7-111-46831-8-Chapter02-93.jpg

参考程序如下:

978-7-111-46831-8-Chapter02-94.jpg

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

我要反馈