算术运算类指令共有24条,包括加减乘除四种基本的算术运算。这类指令的作用为:
1)对8位的无符号数进行直接运算。
2)借助溢出标志,可对带符号数进行补码运算。
3)借助进位标志,可以实现多精度的加、减和环移。
4)借助十进制调整,可对压缩的BCD数进行运算。
5)多字节、多精度数的运算。
算术运算类指令大部分会影响标志位,指令执行的结果将使进位(Cy)、辅助进位(AC)、溢出(OV)三种标志位置位或复位。但是加1和减1指令不影响这些标志。
1.加法指令及要点分析
(1)加法指令指令介绍
例如:A=3BH,PSW=0,执行指令ADD A,#3BH
求:A,Cy,OV,AC,P,PSW
解:
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。
结果:-5CH=-92(错误)
符号位(位7)由0变1,结果变负,实际上它成为和数的最高位,符号位移入进位标志。
再看-120与-100之和,它们的补码分别为10001000B和10011100B,相加过程中位6无进位而位7有进位,OV=CP⊕CS=1。
结果:+24H=+36(错误结果)
符号位由1变0,结果变正,这是因为符号位移入进位标志之故。在上述两种情况下,溢出标志OV将置位。因此在实行带符号数的加法运算时,OV是一个重要的辨别标志。
4)进位标志可用来判断无符号数的运算结果是否正确,还用来实现多字节数的运算;溢出标志主要用来判断带符号数的运算结果是否正确。
2.带进位加法指令及要点分析
(1)指令介绍
例如:已知:A=9AH,R2=E3H,PSW=0,执行指令ADDC A,R2
求:A,Cy,OV,AC,P,PSW
解:
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单元。
程序如下:
图2-25 片内RAM存储示意图
3.加1指令及要点分析(www.xing528.com)
(1)指令介绍
(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)指令介绍
(2)要点分析
1)指令从累加器的内容中减去指定的一个字节和进位标志。
2)够减时,进位标志复位,不够减时,发生借位,进位标志置位。借助进位(用来指示有无借位)标志可以实现多精度减法。
3)当位3发生借位时,AC置位,否则AC复位。
4)当位6及位7不同时发生借位时,OV置位,否则OV复位。在作带符号数运算时,只有当符号不相同的两数相减时才会发生溢出,所以OV置位表示发生了正数减去负数差为负,或是负数减去正数差为正的情况,显然是不对的。
5)没有不带借位的减法指令,如果需要做不带借位的减法指令(在做第一次相减时),只要将Cy清零即可。
5.减1指令
这组指令的功能是将指定单元的内容减1,结果仍在原单元中。指令执行结果不影响标志位。
6.乘法、除法指令及要点分析
(1)指令介绍
(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
二进制数向BCD数转换原理:229/100的商是2,余数29;29/10的商是2,余数9,合并2和9。
程序如下:
7.十进制调整指令及要点分析
(1)指令介绍
(2)要点分析
1)这条指令必须紧跟在ADD或ADDC指令之后,且这里的ADD或ADDC的操作是对压缩的BCD数进行运算。
2)DA指令不影响溢出标志。
3)不能用DA指令对十进制减法操作的结果进行调整。
4)借助进位标志可实现多位BCD数加1和减1。
例如:设一个加数存放在50H、51H单元,另一个加数存放在52H、53H单元。4位压缩的BCD数的相加,和数放到50H、51H单元。
即:
参考程序如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。