首页 理论教育 STC15W4K32S4系列8051单片机算术操作

STC15W4K32S4系列8051单片机算术操作

时间:2023-11-02 理论教育 版权反馈
【摘要】:STC单片机指令系统中,共有算术操作类指令24条,可分为加法、带进位加法、带借位减法、加1、减1、乘/除法和十进制数调整指令。程序如下:3.加1、减1指令加1指令有如下5条,指令助记符为INC:减1指令有如下4条,指令助记符为DEC:这组指令的功能是将操作数所指定的单元内容自加1、自减1。4)当操作单元的内容为FFH时,执行INC加1指令后,操作单元内容为00H,且有进位,但不影响Cy、OV、Ac标志。

STC15W4K32S4系列8051单片机算术操作

STC单片机指令系统中,共有算术操作类指令24条,可分为加法、带进位加法、带借位减法、加1、减1、乘/除法和十进制数调整指令。它们都是二进制数算术运算指令,能直接用指令完成单字节操作数的加法、减法、乘法或除法,通过编程也能完成加、减、乘、除四则混合运算。

加、减、乘、除法指令是单字节二进制数算术运算指令,对单字节数可直接运算;借助OV溢出标志,可对有符号数进行二进制补码运算;借助进位标志,可进行多字节二进制数加法、减法运算,对多字节压缩BCD码也能进行加法、减法运算。加、减、乘、除指令必须在累加器A中进行。

算术运算指令执行的结果对Cy、Ac、OV三种标志位有影响,但对加1和减1指令除外。只要修改了累加器A的值,就会影响P标志。

1.加法指令

这组指令有如下4条:

这组指令的功能是把累加器A的内容与源操作数相加,相加结果存储在A中。这些指令中参加运算的都是8位二进制数,对用户而言,这两个8位数可当作无符号数(0~255),也可以当作有符号数(-128~127),即补码数。例如,对应二进制数10110110,用户可以认为它是无符号数,即等于十进制数182;也可认为它是带符号数,即为十进制负数-54。但无论如何,计算机在进行加法运算时,都是按以下的规则进行计算的:

1)进行求和运算时,两个操作数以二进制数的形式直接进行对应位相加,而不经过任何变换。例如,设(A)=10111101B,(R2)=11000111B,则执行指令ADD A,R2时,其实际算式为

相加后(A)=10000100B。如果认为是无符号数相加,则A的内容表示为十进制数132;如果认为这是有符号数相加,那么A的内容表示为十进制数-4。

2)进位标志Cy是两个无符号操作数相加时,标明加法指令执行结果是否有进位的一个标志,若位7有进位,Cy=1,此时的Cy表示十进制数的256(如上例);若位7没有进位则Cy=0。同时,辅助进位标志AC也会有影响,若位3有进位AC=1,否则AC=0。如果是两个有符号操作数相加,此时进位标志Cy无实际意义。

3)加法指令会影响OV溢出标志,溢出标志是否有意义,要看用户定义的数是否为有符号数。若是两个有符号数进行算术运算,当OV=1,数据运算溢出,运算结果有错误;当OV=0,数据运算结果正确。

然而,在进行算术运算时,计算机不会区分有符号、无符号的数,它总是把参加运算的操作数当作带符号数来对待,即只要位6和位7其中一个向高位有进位,OV=1,表明数据运算溢出;否则,如果位6和位7同时有进位或同时没有进位,OV=0,表明数据运算没有溢出。事实上,一个正数与一个负数相加是不会产生溢出的,只有两个正数或两个负数相加时才有可能产生溢出,运算结果出错。

【例3-10】 若(A)=57H,(R2)=E5H,执行指令ADD A,R2。

运算式为

结果为(A)=3CH,Cy=1,AC=0,OV=0,P=0。注意:上面的运算中,位6和位7同时有进位,故OV=0,运算结果是正确的。若(A)=9DH,(R1)=40H,(40H)=D6H,执行指令ADD A,@R1。运算式为

结果为(A)=73H,Cy=1,AC=1,OV=1,P=1。

注意:上面的运算中,位6无进位,位7有进位,故OV=1,运算结果是错误的。

4)加法指令也会影响辅助进位位AC和奇偶标志P,在上面的例子中,可以看出AC标志和P标志的变化。

2.带进位加法指令

这组指令有如下4条:

这组指令的功能是把源操作数所指出的内容、进位标志Cy都与累加器A的内容相加,结果存储在A中。这组指令的特点是进位位Cy也参加了运算,因此带进位位相加的操作得到的是3个数相加的结果。

【例3-11】 (A)=69H,(30H)=ADH,Cy=1,执行指令ADDC A,30H。

运算式为

结果为(A)=17H,Cy=1,Ac=1,OV=0,P=0。

【例3-12】 编程实现两个双字节无符号数加法,即(R5 R4)+(R7 R6),结果存储在(R3 R2)中。

根据题意,双字节无符号数是一个16位数,这3个16位数的高8位分别存储在R5、R7、R3中,低8位分别存储在R4、R6、R2中。由于单片机没有16位二进制数的加法指令,因此必须编写程序来完成。按照加法原则,应从低位开始相加,即先加低8位,后加高8位,低位产生的进位应同时加到高位上。程序如下:

3.加1、减1指令

加1指令有如下5条,指令助记符为INC:

减1指令有如下4条,指令助记符为DEC:

这组指令的功能是将操作数所指定的单元内容自加1、自减1。其指令执行特点是:

1)指令操作是按二进制的形式进行加1、减1。

2)执行加1、减1指令后不会影响Cy、OV、Ac标志位。

3)当操作单元的内容为00H时,执行DEC减1指令后,操作单元内容为FFH,且有借位,但不影响Cy、OV、Ac标志。

4)当操作单元的内容为FFH时,执行INC加1指令后,操作单元内容为00H,且有进位,但不影响Cy、OV、Ac标志。

5)只有涉及累加器A的指令,如INC A、DEC A指令,才会影响P标志。

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

7)加1、减1指令中,只有操作数为直接地址时,指令为双字节指令,其他指令为单字节指令。

8)当操作数的直接地址为P0~P3端口时,其功能是修改I/O口的输出内容。其指令的执行过程是:先从端口的锁存器读入原始数据,然后在CPU中加1、减1,再将结果写入端口寄存器输出。这类指令具有“读→修改→写”的功能。

【例3-13】 设(R0)=31H,(30H)=00H,(31H)=0FH,(P1)=FFH,(DPTR)=21FFH,逐条分析下面指令执行后各单元的内容。

4.十进制调整指令(www.xing528.com)

这是一条对二进制和十进制的加法进行调整的指令,用于对BCD码数加法运算结果的修正,修正后的结果仍然按BCD码的形式存储。

指令格式:DA A。指令的功能是在两个BCD码按二进制相加后,采用该指令对相加的和进行调整,以得到正确的累加和。指令的应用特点如下:

1)二进制和十进制调整必须在A中进行,两个压缩的BCD码按二进制相加后必须经过本指令调整后,才能得到正确的BCD码数,从而实现十进制的加法运算。

2)BCD码加法问题:二进制数的加法运算原则上并不能适用于十进制数的加法运算,有时会产生错误结果。例如,4+5=9,0100+0101=1001,运算结果正确;6+9=15,0110+1001=1111,运算结果不正确;9+8=17,1001+1000=00001,Cy=1,结果不正确。通过以上3个例子,说明二进制数加法指令不能完全适用于BCD码十进制数的加法运算。这是因为BCD码是用4位二进制数表示的1位十进制数,而4位二进制可以组成16个编码,BCD码只用了其中的10个,有6个没用到。这6个没用到的编码(1010、1011、1100、1101、1110、1111)称为无效码。所以在BCD码的加法运算中,只要“和”数进入或跳过无效码,其运算结果一定是错误的。1位BCD码的加法运算,其结果出错可分以下两种:相加的和大于9,说明已经进入无效码区;相加后有进位,即Cy=1或Ac=1,说明已经跳过无效码。

因此,造成BCD码加法出错的原因就是因为存在6个无效码,显然BCD码是一种假二进制数。所以,要想得到正确结果,必须进行二进制“和”的十进制调整。

3)十进制调整方法:累加器低4位大于9或辅助进位位Ac=1,则进行低4位加6修正;累加器高4位大于9或进位位Cy=1,则进行高4位加6修正;累加器高4位为9,低4位大于9,则高4位和低4位分别加6修正。

【例3-14】 设有两个单字节压缩BCD码数(A)=47H,(R5)=65H,将两个BCD码进行加法运算得到的BCD码存储在R6 R5中。分析执行以下程序:

运算式为

程序执行结果为(R6)=01H,(R5)=12H。可见47+65=112,结果是正确的。

4)特别需要注意的是,DA指令不能对减法进行十进制调整,也不能对十六进制的加法进行十进制调整,只能对两个单字节的BCD码加法进行十进制调整。

5.带借位的减法指令

带借位减法指令有如下4条:

这组指令的功能是从累加器A中的内容减去指定的变量和借位标志Cy的值,结果存储在累加器A中。指令的应用特点如下:

1)这组指令是单字节二进制数减法指令,必须在累加器A中作减法,将A的内容减去Cy和操作数。

2)指令执行会影响Cy、OV、Ac、P四个标志位。对于借位标志,如果位7需借位则置Cy=1,否则清Cy=0;如果位3需借位则置Ac=1,否则清Ac=0。对于溢出标志,如果位6有借位,而位7无借位,或者位7有借位,位6无借位,则置溢出标志位OV=1;否则,如果位6、位7同时有借位或同时无借位,则清OV=0。

3)标志值的意义:计算机总是把操作数当作带符号的数进行减法。对于有符号数的两个数相减后,若OV=1,则表明结果是错误的;若OV=0,则表明结果是正确的。对于无符号数的两个数相减后,也会影响标志位,但此时的OV标志值无实际意义。

借位标志Cy,表示两个无符号数相减时,最高位是否有借位产生,Cy=1表示有借位(被减数比减数小),Cy=0表示无借位(被减数比减数大)。

4)减法指令都是带借位的减法指令,因此,如果要求进行不带借位的减法操作,应事先把借位标志清0,即Cy=0。

【例3-15】 假设(A)=D3H,(R2)=7CH,Cy=1,用减法指令计算(A)-(R2)的值,则执行指令SUBB A,R2。

运算式为

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

6.乘、除法指令

乘、除法指令是单字节四机器周期的指令,是单片机指令系统中执行周期最长的两条指令。指令是二进制乘、除法指令,即只能对两个单字节的二进制数进行乘除。如果要求对两个多字节数进行乘、除法运算,则必须编写算法程序。

(1)乘法指令格式

该指令的功能是把累加器A和寄存器B中的无符号8位二进制整数相乘得到16位的乘积,其低8位在累加器A中,高8位在寄存器B中。如果乘积大于255,则置溢出标志位OV=1,否则清OV=0。进位标志总是零,即Cy=0。

若(A)=0CH,(B)=7AH,则执行指令MUL AB。

结果为(B)=05H,(A)=B8H。

由于乘积5B8H大于255,则标志位Cy=0,OV=1,P=0。

【例3-16】 利用单字节乘法指令进行双字节数乘以单字节数操作,即(R3 R2)×(R4),乘积存储在寄存器(R7、R6、R5)中。

分析题意可知双字节数乘以单字节数,乘积最大是三字节数。该运算的算法步骤为:将双字节被乘数分成高8位、低8位,并分别与乘数相乘,然后将两次得到的乘积进行错位相加,即可得到最后的乘积。算法思路如下:

参考程序如下:

(2)除法指令格式

该指令的功能是把累加器A中的8位单字节无符号数除以B中的单字节无符号数,所得商存储在累加器A中,余数存储在寄存器B中。指令的应用特点是:

1)除法指令按照8位无符号二进制的形式进行相除。

2)执行除法指令后,进位标志和溢出标志均被清0。

3)若除数等于0时,除法运算没有意义,运算结果A、B中的内容不确定,此时溢出标志位OV=1,进位标志Cy=0。

若(A)=0EFH,(B)=1AH,则执行指令DIV AB。

结果为(A)=09H,(B)=05H,Cy=0,OV=0。

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

我要反馈