2.6.1 算术运算类指令

2.6.1 算术运算类指令

MCS-51单片机中算术运算类指令包括加、减、乘、除基本四则运算,这类指令多数以累加器A为目的操作数。算术运算类指令都是针对8位二进制无符号数的,如要进行带符号或多字节二进制数运算,需编写具体的运算程序,通过执行程序来实现。

算术运算结果将使进位标志位CY、半进位AC、溢出位OV三个标志位置位或清0,只有加1和减1指令不影响这些标志位,见表2-6。

表2-6 算术运算指令对状态标志位的影响

注:√表示有影响;×表示无影响;0表示清0。

1.加法指令

加法指令一共有4条:

这4条二进制数加法指令的一个加数来自累加器A,另一个加数可由寄存器寻址、寄存器间接寻址、直接寻址和立即数寻址等不同的寻址方式得到。其相加的结果放在累加器A中。

上述指令的执行将影响标志位AC、CY、OV、P。溢出标志位OV只有在带符号数运算时才有意义。若两个带符号数相加后OV=1,则表示产生了溢出,运算结果超出了累加器A所能够表示的带符号数的有效范围,运算结果是错误的;若两个带符号数相加后OV=0,则表示没有溢出,运算结果是正确的。

【例2-1】 设(A)=0C3H,(R0)=0AAH,执行指令

所得和为6DH,标志位CY=1,AC=0,P=1,OV=1,溢出标志OV在CPU内部根据异或门输出置位,OV=C7⊕C6=1。

2.带进位加法指令

带进位加法指令有4条:

这组指令的功能是同时把源操作数所指出的内容和进位标志位CY都加到累加器A中,并将结果存放在累加器A中,其余的功能和ADD指令相同。同样,本指令将影响标志位AC、CY、OV、P。本指令常用于多字节加法。

【例2-2】 设(A)=85H,(20H)=0FFH,CY=1,执行指令

所得和为85H,标志位CY=1,AC=1,OV=0,P=1。

3.增1指令

共有5条增1指令:

这组指令的功能是将操作数所指定的单元内容加1,其操作不影响PSW。若原单元内容为FFH,加1后溢出为00H,这也不会影响PSW。

4.十进制调整指令

该指令的功能是对累加器A中刚进行的两个BCD码的加法结果进行十进制调整。

两个压缩的BCD码按二进制相加后,必须经过调整才能得到正确的压缩BCD码的和。

对于十进制数(BCD码)的加法运算,只能借助于二进制加法指令。然而,二进制数的加法运算原则上并不能适应于十进制数的加法运算,有时会产生错误结果。例如,

0111是7的BCD码,结果正确。

又例如,

1110并非14的BCD码,结果出现错误。14的BCD码是0001 0100B,所以此时需要进行十进制调整,调整要完成的任务是:

(1)当累加器A中的低四位数出现了非BCD码(1010~1111)或低四位产生进位(AC=1)时,则应在低4位加6调整,以产生低4位正确的BCD码结果。

(2)当累加器A中的高4位数出现了非BCD码(1010~1111)或高4位产生进位(CY=1)时,则应在高4位加6调整,以产生高4位正确的BCD码结果。

十进制调整指令执行后,PSW中的CY表示结果的百位值。

【例2-3】 (A)=67 H,(R3)=78 H,把他们看作压缩BCD数,进行BCD加法,执行指令

结果为A=45 H,C=1。由此可见,结果是正确的。

5.带借位减法指令

将累加器A的内容减去指定变量和进位标志CY的值,结果存在累加器A中。

【例2-4】 (A)=C9 H,(R2)=54 H,CY=1,执行指令

结果为(A)=74H,CY=0,AC=0,OV=1(位6向位7借位)。

8051指令中没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要先将CY清0即可。

6.减1指令

共有4条减1指令:

这组功能是指定的变量减1。若原来为00 H,减1后下溢为FFH,不影响标志位(P标志除外)。

7.乘法指令

累加器A的内容和寄存器B的内容相乘,积的低字节在累加器A中,高字节在寄存器B中。如果积大于255,则OV置1,否则OV清0。CY标志总是清0。

8.除法指令

累加器A的内容除以寄存器B的内容,商(取整数)存放在累加器A中,余数存放在寄存器B中,且CY和溢出标志位OV清0。

但是,如果寄存器B的内容为0(即除数为0),则存放结果中累加器A、寄存器B的内容不定,并且溢出标志位OV置1。