算术操作类指令的功能是进行加、减、乘、除四种基本算术运算。它包括加法指令、减法指令、乘法指令、除法指令和十进制数调整指令。
1.加法指令
加法指令又分不带进位的加法指令、带进位的加法指令和加l指令。
(1)不带进位的加法指令
不带进位的加法指令的操作码助记符是“ADD”。
指令格式:ADD A,操作数2
指令的功能是将操作数2与累加器A中的数据相加,结果保存在A中。
不带进位的加法指令有4条,各条指令的形式和功能见表3-11。
表3-11 不带进位的加法指令
下面举两个例子来说明不带进位的加法指令的功能。
1)ADD A,#36H。在指令执行前,如果累加器A中的数据为56H,那么指令执行后,累加器A中的数据为8CH(36H+56H)。
2)ADD A,R6。在指令执行前,如果累加器A中的数据为78H(01111000),R6中的数据为累加器89H(10001001),那么指令执行后,相加得到的数据为101H(10000 0001),累加器A是一个8位寄存器,所以只能存储8位数00000001(01H),而最高位D7的进位会保存在PSW的进位标志位CY中,即让CY=1,另外两个数据的低4位相加(1000+1001)时,D3位会向高位D4位进位,在进位的同时会将PSW的半进位标志位AC位置“1”。
(2)带进位的加法指令
带进位的加法指令的操作码助记符是“ADDC”。
指令格式:ADDC A,操作数2
指令的功能是将操作数2与累加器A中的数据相加,再与PSW中CY位的数据相加,结果保存在累加器A中。
带进位的加法指令有4条,各条指令的形式和功能见表3-12。
表3-12 带进位的加法指令
下面举例说明带进位的加法指令的功能。
例如:ADDC A,#36H
在指令执行前,如果累加器A中的数据为56H,寄存器PSW中CY位的数据为“1”,那么指令执行后,累加器A中的数据为8DH(36H+56H+1)。
【例3-4】 实现两字节加法指令,其中加数存于30H(低)、31H(高),被加数存于40H(低)、41H(高),和存于50H(低)、51H(高)。
解答:为方便记忆列分配表如下:
(3)加1指令
加1指令又称增量指令,它的操作码助记符是“INC”。
指令格式:INC操作数
指令的功能是将操作数加1,结果仍保存在该操作数中。
加1指令有5条,各条指令的形式和功能见表3-13。
表3-13 加1指令
下面举例说明加1指令的功能。
例如:INC@R0
在指令执行前,如果寄存器R0中的地址为56H,56H单元中的数据为35H,那么指令执行后,56H单元中的数据为36H。
2.减法指令
减法指令又分带借位的减法指令和减1指令。
(1)带借位的减法指令
带借位的减法指令的操作码助记符是“SUBB”。
指令格式:SUBB A,操作数2
指令的功能是将累加器A中的数据减去操作数2,再减去PSW中CY位的数据,结果保存在累加器A中。
带借位的减法指令有4条,各条指令的形式和功能见表3-14。
表3-14 带错位的减法指令
下面举例说明带借位的减法指令的功能。
例如:SUBB A,R6
在指令执行前,如果累加器A中的数据为89H,寄存器R6中的数据为78H,CY位中的数据为1,那么指令执行后,累加器A中的数据为10H(89H-78H-1)。
如果需要不借位,可先将CY位清0,清0指令将在后面介绍。(www.xing528.com)
(2)减1指令
减1指令的操作码助记符是“DEC”。
指令格式:DEC操作数
指令的功能是将操作数减1,结果仍保存在该操作数中。
减1指令有4条,各条指令的形式和功能见表3-15。
表3-15 减1指令
下面举例说明减1指令的功能。
例如:DEC@R0
在指令执行前,如果寄存器R0中的地址为56H,56H单元中的数据为35H,那么指令执行后,56H单元中的数据为34H。
3.乘法指令
乘法指令的操作码助记符是“MUL”。
乘法指令只有1条,该条指令的形式和功能见表3-16。
表3-16 乘法指令
下面以一个程序段为例来说明乘法指令的功能。例如:
MOV A,#36H
MOV B,#07H
MUL AB
上面的第1条指令是将数据#36H(00110110)送到累加器A中;第2条指令是将数据#07H(00000111)送到寄存器B中;第3条指令是将A和B中的数据相乘(00110110×00000111);将相乘的结果0000000101111010(017AH)的低8位(7AH)保存在A中,高8位(01H)保存在B中。
4.除法指令
除法指令的操作码助记符是“DIV”。
除法指令只有1条,该条指令的形式和功能见表3-17。
表3-17 除法指令
下面以一个程序段为例来说明除法指令的功能。例如:
MOV A,#0FBH
MOV B,#12H
DIV AB
上面的第1条指令是将数据#0FBH(11111011)送到累加器A中;第2条指令是将数据#12H(00010010)送到寄存器B中;第3条指令是将A和B中的数据相除(11111011÷00010010);得到的商1101(0DH)保存在A中,余数10001(11H)保存在B中。
5.十进制数调整指令
单片机在对十进制数进行加法运算时,用BCD码(由4位二进制数构成)来表示十进制数,再对BCD码进行加法运算,得到的结果仍要用BCD码表示,但有时得到的结果可能不是BCD码。例如:
(1)3+5=8(2)5+9=14(3)8+9=17
在例(1)中,两个BCD码相加后的运算结果仍是BCD码;在例(2)中,两个BCD码相加后的结果不是BCD码,因为BCD码只有9个(0000~1001),1110不是BCD码;在例(3)中,两个BCD码相加后的结果是错误的BCD码,因为BCD码只有4位,如果把10001当做是2位BCD码,还原就成了11,结果错误。采用十进制数调整指令可以解决这个问题。
十进制数调整指令又称BCD码调整指令,它的操作码助记符是“DA”。
十进制数调整指令的形式和功能见表3-18。
表3-18 十进制数调整指令
下面以一个BCD码加法程序段为例来说明十进制数调整指令的功能:
上面的第1条指令是将数据#56H送到累加器A中;第2条指令是将A中的数据56H(01010110)与数据#67H(01100111)相加,得到的结果是BDH(10111101),显然结果不是BCD码(因为1011和1101都不是BCD码);第3条指令是将第2条指令相加后的运算结果BDH(10111101)进行BCD调整。调整过程如下:
从上面的竖式中可以看出,指令先判断相加结果的低4位是否大于9(1001),若大于9,则将低4位加6(0110),然后判断低4位加6后得到结果的高4位是否大于9,若大于9,再将高4位加6,这样修正的结果是100100011(123H=56H+67H)。
在进行普通的加法运算时,后面不用加“DA A”指令;如果在加法运算指令后加上该指令,进行的加法运算将是BCD加法运算。一般减法后使用该指令要慎重。
【例3-5】 已知梯形的上底、下底和高分别是2、5、2,计算梯形的面积,并将之存储到单片机内存的40H中。
解答:本例要实现梯形面积的运算,主要分为三步:计算a+b;计算(a+b)×h;计算(a+b)×h÷2。在汇编语言中,除法运算是取余,因此此计算梯形的方法仅适用于上底加下底结果为偶数的梯形。此外,为了使梯形的面积值便于观察,程序中分别定义梯形的上底长a、下底长b、高h的数值都比较小,这样(a+b)×h的数值不会超过0FFH。
根据上面的分析,先分配上底、下底、高的具体数据存储单元,见如下地址分配表:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。