AT89S51算术运算类指令
扫描二维码
随时随地手机看文章
在AT89S51指令系统中,有单字节的加、减、乘、除法指令,算术运算功能比较强。算术运算指令都是针对8位二进制无符号数的,如要进行带符号或多字节二进制数运算,需编写具体的运算程序,通过执行程序实现。
算术运算的结果将使PSW中的进位(Cy)、辅助进位(Ac)、溢出(OV)3种标志位置1或清0,但是增1和减1指令不影响这些标志。
1.加法指令
共有4条加法运算指令:
这4条8位二进制数加法指令的一个加数总是来自累加器A,而另一个加数可由寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址等不同的寻址方式得到。其相加的结果总是放在累加器A中。
使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:
(1)如果位7有进位,则进位标志Cy置l,否则Cy清0。
(2)如果位3有进位,辅助进位标志Ac置1,否则Ac(Ac为PSW寄存器中的一位)清O。
(3)如果位6有进位而位7没有进位,或者位7有进位而位6没有进位,则溢出标志位OV置l,否则OV清0。
溢出标志位OV的状态,只有进行带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围(-128~+127),即产生了溢出,表示运算结果是错误的,否则运算是正确的,即无溢出产生。
【例3-1】 (A)=53H,(RO)=FCH,执行指令
运算式为
结果为(A)=4FH,Cy=l,Ac=0,OV=O,P=1(A中l的位数为奇数)。
注意:在上面的运算中,由于位6和位7同时有进位,所以标志位OV=O。
【例3-2】 (A)=85H,(RO)=20H,(20H)=AFH,执行指令
运算式为
结果为(A)=34H,Cy=l,Ac=l,OV=1,P=1。
注意:由于位7有进位,而位6无进位,所以标志位OV=1。
2.带进位加法指令
带进位加法运算的特点是进位标志位Cy参加运算,因此带进位的加法运算是三个数相加。带进位的加法指令共4条:
这组带进位加法指令的功能是,指令中不同寻址方式所指定的加数、进位标志与累加器A内容相加,结果存在累加器A中。
如果位7有进位,则进位标志Cy置1,否则Cy清0;如果位3有进位输出,则辅助进位标志Ac置l,否则Ac清0;如果位6有进位而位7没有进位,或者位7有进位而位6没有进位,则溢出标志OV置1,否则标志OV清O。
【例3-3】 (A)=85H,(20H)=FFH,Cy=l,执行指令
运算式为
结果为(A)=85H,Cy=l,Ac=l,OV=0,P=l(A中1的位数为奇数)。
3.增1指令
共有5条增1指令:
这组增1指令的功能是把指令中所指出的变量增1,且不影响程序状态字PSW中的任何标志。若变量原来为FFH,加1后将溢出为OOH(仅指前4条指令),标志也不会受到影响。第5条指令“INC DPTR”,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1操j作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。
4.十进制调整指令
十进制调整指令用于对BCD码十进制数加法运算结果的内容进行修正,指令格式为:
这条指令的功能是对压缩的BCD码(一个字节存放2位BCD码)的加法结果进行十进制调整。两个BCD码按二进制相加之后,必须经本指令的调整才能得到正确的压缩BCD码的和数。
(1)十进制调整问题
对于十进制数(BCD码)的加法运算,只能借助于二进制加法指令。然而,二进制数的加法运算原则上并不能适用于十进制数的加法运算,有时会产生错误结果。
例如:
上述的BCD码运算中:
(a)运算结果正确。
(b)运算结果不正确,因为十进制数的BCD码中没有1111这个编码。
(c)运算结果也不正确,正确结果应为17,而运算结果却是11。
这种情况表明,二进制数加法指令不能完全适用于BCD码十进制数的加法运算,因此要对结果进行有条件的修正,这就是所谓的十进制调整问题。
(2)出错原因和调整方法
出错的原因在于BCD码是4位二进制编码,共有16个编码,但BCD码只用了其中的10个,剩下6个没用到。这6个没用到的编码(1010,1011,1100,1101,1110,1111)为无效编码。
在BCD码的加法运算中,凡结果进入或者跳过无效编码区时,其结果就是错误的。因此1泣BCD码加法运算出错的情况有以下两种:
①相加结果大于9,说明已经进入无效编码区。
②相加结果有进位,说明已经跳过无效编码区。
无论哪一种出错情况,都是因为6个无效编码造成的。因此,只要出现上述两种情况之一,就必须进行调整。调整的方法是把运算结果加6调整,即所谓的十进制调整修正。
十进制调整的修正方法如下:
①累加器低4位大于9或辅助进位位Ac=l,则进行低4位加6修正。
②累加器高4位大于9或进位位Cy=l,则进行高4位加6修正。
③累加器高4位为9,低4位大于9,则高4位和低4位分别加6修正。
上述十进制调整修正,是通过执行指令“DA A”自动实现的。
【例3-4】 (A)=56H,(R5)=67H,把它们看作两个压缩的BCD数,进行BCD数加法。
执行指令:
由于高4位和低4位分别大于9,所以“DA A”指令要分别加6,来对结果进行修正。
结果为(A)=23H,Cy=l。
由上可见,56+67=123,结果是正确的。
5.带借位的减法指令
共有4条指令:
这组带借位减法指令是从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存放在累加器A中。
如果位7需借位则Cy置l,否则Cy清0;如果位3需借位则Ac置1,否则Ac清0;如果位6需借位而位7不需要借位,或者位7需借位而位6不需借位,则溢出标志位OV置1,否则OV清0。
源操作数允许有寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址方式。
【例3-5】 (A)=C9H,(R2)=54H,Cy=l,执行指令
运算式为
结果为(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位)。
6.减1指令
共有4条指令:
这组指令的功能是指定的变量减1。若原来为OOH,减1后下溢为FFH,不影响标志位(P标志除外)。
【例3-6】 (A)=OFH,(R7)=19H,(30H)=OOH,(Rl)=40H,(40H)=OFFH,执行指令
结果为(A)=OEH,(R7)=18H,(30H)=OFFH,(40H)=OFEH,P=l,不影响其他标志。
7.乘法指令
这条指令的功能是把累加器A和寄存器B中的无符号8位整数相乘,其16位积的低位字节在累加器A中,高位字节在B中。如果积大于255,则溢出标志位OV置1,否则OV清0。进位标志位Cy总是清0。
8.除法指令
该指令的功能是用累加器A中8位无符号整数(被除数)除以B中8位无符号整数(除数),所得的商(为整数)存放在累加器A中,余数存放在寄存器B中,且Cy和溢出标志位OV清0。如果B的内容为0(即除数为0),则存放结果的A、B中的内容不定,并溢出标志位OV置l。
【例3-7】 (A)=FBH,(B)=12H,执行指令
结果为(A)=ODH,(B)=11H,Cy=0,OV=O。