理论教育 单片机算数运算指令-单片机原理及接口技术

单片机算数运算指令-单片机原理及接口技术

时间:2023-11-05 理论教育 版权反馈
【摘要】:MCS-51系列单片机的算术运算类指令共有24条,可以完成加、减、乘、除等各种操作,全部指令都是8位数运算指令。如果需要做16位数的运算则需编写相应的程序来实现。算术运算类指令大多数要影响到程序状态字寄存器PSW中的溢出标志OV、进位(借位)标志Cy、辅助进位标志Ac和奇偶标志位P。运算结果对PSW标志位的影响与ADD指令相同。

单片机算数运算指令-单片机原理及接口技术

MCS-51系列单片机的算术运算类指令共有24条,可以完成加、减、乘、除等各种操作,全部指令都是8位数运算指令。如果需要做16位数的运算则需编写相应的程序来实现。

算术运算类指令大多数要影响到程序状态字寄存器PSW中的溢出标志OV、进位(借位)标志Cy、辅助进位标志Ac和奇偶标志位P。利用进位(借位)标志Cy,可进行多字节无符号整数的加、减运算,利用溢出标志OV可对带符号数进行补码运算,辅助进位标志Ac则用于BCD码运算的调整。

1.加法指令

共有4条加法指令:

这组指令的功能是把源操作数所指出的内容与累加器A的内容相加,其结果存放在A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。运算结果对程序状态字PSW中的Cy、Ac、OV和P的影响情况如下。

进位标志位Cy:在加法运算中,如果D7位向上有进位,则Cy=1,否则,Cy=0。

辅助进位位Ac:在加法运算中,如果D3位向上有进位,则Ac=1,否则,Ac=0。

溢出标志位OV:在加法运算中,如果D7、D6位只有一个向上有进位时,OV=1;如果D7、D6位同时有进位或同时无进位时,OV=0。设D6向上的进位为C6,D7向上的进位为C7,则溢出标志位可以用公式表示为:OV=C6⊕C7,其中符号⊕表示异或运算。OV只有在有符号数的运算时才有意义。

奇偶标志P:当A中的“1”的个数为奇数时,P=1;为偶数时,P=0。

例如:设(A)=94 H,(30H)=8DH,执行指令ADD A,30 H,操作如下:

结果:(A)=21 H,Cy=1,Ac=1,OV=1,P=0。

参加运算的两个数,既可以是无符号数(0~255),也可以是有符号数(-128~+127),用户可以根据标志位Cy或OV来判断结果是否正确。无符号数用Cy来表示进位、溢出(不考虑OV位),有符号数用OV位表示溢出(不考虑Cy位)。

上例中,若把94H、8DH看作无符号数相加,结果中Cy=1,表示运算结果发生了溢出(结果超出了8位),此时溢出的含义是向高位产生进位,所以确定结果时不能只看累加器A的内容,而应该把Cy的值加到高位上,才可得到正确的结果,即结果为121 H;若把94H、8DH看作有符号数(补码表示的),结果中OV=1,它表示运算结果发生了溢出,A中的值是个错误的结果。两个正数相加或两个负数相加时,若结果发生溢出,将改变结果的符号位,因此所得结果必然是错误的,OV=l正好指出了这一类错误。

无论编程人员把参加运算的两个数看作是无符号数还是有符号数,计算机在每次运算后,都会按规则自动机械地设置标志位Cy、OV、Ac、P等标志位,因此对于编程人员来说,必须根据这些标志位来解释当前运算结果的正确性,以确定程序的走向。

2.带进位加法指令

共有4条加法指令:

这组指令的功能是把源操作数所指出的内容与累加器A的内容相加,再加上进位标志Cy的值,其结果存放在A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。运算结果对PSW标志位的影响与ADD指令相同。

需要说明的是,这里所加的进位标志Cy的值是在该指令执行之前已经存在的进位标志值,而不是执行该指令过程中产生的进位标志值。例如:

设(A)=0AEH,(R1)=81 H,Cy=1,执行指令ADDC A,R1,操作如下:

结果:(A)=30H,Cy=1,OV=1,Ac=1,P=0。

带进位位加法指令主要用于多字节数的加法运算。由于低位字节相加时可能向高位字节产生进位,因而在进行高位字节相加时,必须要考虑低位字节向高位字节的进位,基于此在进行多字节数的加法时必须使用带进位位的加法指令。

3.带借位减法指令

共有4条加法指令:

这组指令的功能是将累加器A中的数减去源操作数所指出的数和进位位Cy,其结果存放在累加器A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。运算结果对程序状态字PSW中各标志位的影响情况如下。

借位标志位Cy:在减法运其中,如果D7位向上需借位,则Cy=1,否则,Cy=0。

辅助位标志Ac:在减法运算中,如果D3位向D4位借位,则Ac=1,否则,Ac=0。

溢出标志OV:在减法运算中,如果D7、D6只有一个向上一位借位时,OV=1,如果D7、D6位同时需要借位或同时无借位时,OV=0。设D6向上的借位为C6,D7向上的借位为C7,则溢出标志位可以用公式表示为:OV=C6⊕C7,其中符号⊕表示异或运算。OV只有在有符号数的运算时才有意义。

奇偶标志P:当A中“l”的个数为奇数时,P=1为偶数时,P=0。

减法运算只有带借位减法指令,而没有不带借位的减法指令,若要进行不带借位的减法运算,应该先用指令将Cy清零,然后再执行SUBB指令。

需强调的一点是,减法运算在计算机中实际上是变成补码相加,下面举例说明。

设(A)=0DBH,(R4)=73 H,Cy=1,执行指令SUBB A,R4,操作如下:

结果:(A)=67 H,Cy=0,Ac=0,OV=1。

由上述两式可见两种算法的最终结果是一样的。在此例中,若DBH和73 H是两个无符号数,则结果67 H是正确的;反之,若为两个带符号数,则由于产生溢出(OV=1),使得结果是错误的,因为负数减正数其结果不可能是正数,OV=1,就指出了这一错误。

4.自加1指令

共有5条指令:

这组指令的功能是将操作数所指定单元的内容加l。本组指令除“INC A”指令影响P标志外,其余指令均不影响PSW标志。加1指令常用来修改操作数的地址,以便于使用间接寻址方式。

在这组指令中,INC DPTR,是16位数增1指令,指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。

5.自减1指令

共有4条加法指令:

这组指令的功能是将操作数所指定单元的内容减1。除“DEC A”指令影响P标志外,其余指令均不影响PSW标志。若原来为00 H,减1后下溢为FFH。例如:

(A)=0FH,(R7)=19 H,(30 H)=00H,(R1)=40 H,(40H)=0FFH,执行自减1指令:

结果:(A)=0EH,(R7)=18H,(30H)=0FFH,(40H)=0FEH,P=1,不影响其他的标志位。

6.乘、除法指令

MCS-51系列单片机有乘法除法指令各一条,它们都是一个字节的指令,执行时需要4个机器周期。(www.daowen.com)

(1)乘法指令

MUL AB ;BA←(A)×(B)

这条指令的功能是把累加器A和寄存器B中的两个8位无符号数相乘,所得16位乘积的低8位放在A中,高8位放在B中。

乘法指令执行后会影响3个标志;若乘积小于FF(即B的内容为零),则OV=0,否则OV=1。Cy总是被清零,奇偶标志P仍按A中1的奇偶性来确定。

(2)除法指令

DIV AB ;B(余数),A(商)←(A)/(B)

这条指令的功能是对两个8位无符号数进行除法运算。其中被除数存放在累加器A中,除数存放在寄存器B中。指令执行后,商存于累加器A中,余数存于寄存器B中。对于余数的符号,通常和被除数的符号一致。

除法指令执行后也影响3个标志;若除数为零(B=0)时,OV=1,表示除法没有意义,同时A和B中的内容不确定;若除数不为零,则OV=0,表示除法正常进行。Cy总是被清零,奇偶标志P仍按A中1的奇偶性来确定。例如:

(A)=0FBH,(B)=12H,执行指令

DIV AB

结果:(A)=0DH,(B)=11 H,Cy=0,OV=0。

7.十进制调整指令

有时希望计算机能存储十进制数,也希望计算机能进行十进制数的运算,这时就要用BCD码来表示十进制数。所谓的BCD码就是采用4位二进制编码表示的一位十进制数。4位二进制数共有16个编码,BCD码取它的10个的编码0000~1001来代表十进制数的0~9,这种编码称为8421BCD码,简称BCD码。一个字节可以存放2位BCD码(称为压缩的BCD码)。

如果两个BCD码数相加,结果也是BCD码,则该加法运算称为BCD码加法。在MCS-51系列单片机中没有专门的BCD码加法指令,要进行BCD码加法运算,也要用加法指令ADD或ADDC,然而计算机在执行ADD或ADDC指令进行加法运算时,是按照二进制规则进行的,因此对于4位二进制数是按照逢16进位的原则进行;而BCD码是逢10进位,两者存在进位差,因此用ADD或ADDC指令进行BCD码相加时,可能会出现错误,这时必须进行调整,在讲述调整得原理之前,先看这样几个例子:

(a)运算结果正确。

(b)运算结果不正确,因为十进制数的BCD码中没有1111这个编码。

(c)运算结果也是不正确的,正确的结果应该为17,而运算结果为11。

由此可知,当运算结果大于16或在10~16之间时,都将出现错误结果,因此,要对结果进行修正,这就是所谓的十进制调整问题。

在MCS-51单片机的指令系统中设置了一条对于BCD运算进行调整的指令:

DA A

这条指令的功能是对A中刚进行的两个压缩的BCD码的加法结果进行修正。若两个BCD码按二进制数相加之后,必须经过这条指令的调整才能得到正确的压缩的BCD码的和数。该指令只影响进位标志Cy。使用DA A指令可修正这种错误,它能对运算结果自动进行调整。实际上,计算机在遇到十进制调整指令时,中间结果的修正是由ALU硬件中的十进制调整电路自动进行的。因此,用户不必考虑它是怎样调整的。使用时只需在上述加法指令后面紧跟一条DA A指令即可。

在执行DA A指令之后,若Cy=1,则表明相加后的和已等于或大于十进制数100。

十进制调整的修正方法应是:

(a)累加器低4位大于9或辅助进位位Ac=1,则进行低4位加6修正。

(b)累加器高4位大于9或进位位Cy=1,则进行高4位加6修正。

(c)累加器高4位和低4位均大于9,则高4位和低4位分别加6修正。

例如:(A)=56H,(R5)=67 H,把它们分别看作两个压缩的BCD码,进行BCD码的调整,执行指令:

DA A

由于结果的高、低4位分别大于9,所以要分别加6进行十进制调整,对结果进行修正。

结果为:(A)=23,Cy=1。由上可见,56+67=123,结果是正确的。

需要指出的是,DA A指令只能用在加法指令的后面。如果要进行BCD码减法运算,也应该进行调整,但在MCS-51系列单片机中没有十进制减法调整指令,也不像有的微处理器有加减标志,因此要用适当的方法来进行十进制减法运算。

为了进行十进制减法运算,可以加上减数的补数来进行,两位十进制数是对100取补的,例如:减法60-30=30,也可以修改为补数相加为

60+(100-30)=130

丢掉进位后,就得到正确的结果。

在实际运算时,不可以用9位二进制数来表示十进制数100,因为CPU是8位的。为此,可用8位二进制数10011010(9AH)来代替。因为这个二进制数经过十进制调整后就是100000000。因此,十进制无符号数的减法运算可按以下步骤进行:

(1)求减数的补数,即9AH-减数;

(2)被减数与减数的补数相加;

(3)对第二步的和进行十进制调整,就得到所求的十进制减法运算结果。

这里用“补数”而没有用“补码”,这是为了和带有符号位的补码相区别。由于现在操作数都是正数,没有必要再加符号位,故称“补数”更为合适一些。

【例3-3】 编写程序实现十进制数减法,计算87-38。

解 程序清单如下:

丢掉进位,取调整结果的低8位,即得结果为十进制数49,显然结果是正确的。

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

我要反馈