本公司不接受任何形式的推销,只接受电子邮件。如有需求会主动联系。请西安本地的公司自重!
    西安西保特工电力自动化有限公司

    公司地址:陕西省西安市高新区高新
    路88号尚品国际6幢
    公司邮箱:xibaotegong@aliyun.com
    公司电话:029-88997932
    公司网址:www.

    详细信息

    您现在的位置:网站首页 >> 常见问题 >> 产品知识 >> 详细信息

    算术运算类指令分析

    发布时间:2018-07-18  浏览:409次  字号:  

     算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。


    [1]. 
    加法指令(4条)
    4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。

    ADD  A,#data   ;A+#data→A) 累加器A中的内容与立即数#data相加,结果存在A
    ADD  A,data    ;A+dataA) 累加器A中的内容与直接地址单元中的内容相加,结果存在A
    ADD  A,Rn     ;A+RnA) 累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A
    ADD  A,@Ri    ;A+((Ri))A) 累加器A中的内容与工作寄存器Ri所指向地址单元中的内容相加,结果存在A

    上述这四条指令的用途是:将A中的值与后面的值相加,最终结果存回到累加器A中。
    例:MOV  A#30H
        ADD  A
    #10H
    则执行完本条指令后,A中的值就是40H
    下面的题目请大家自行练习
        MOV  34H,#10H
        MOV  R0,#13H
        MOV  A,34H
        ADD  A,R0
        MOV  R1,#34H
        ADD  A,@R1

    [2]. 
    带进位加法指令(4条)
    4条指令除与[1]功能相同外,在进行加法运算时还需考虑进位问题。

    ADDC    A,data    ;A+data+CA) 累加器A中的内容与直接地址单元的内容连同进位位相加,结果存在A
    ADDC    A,#data   ;A+#data +CA) 累加器A中的内容与立即数连同进位位相加,结果存在A
    ADDC    A,Rn      ;A+Rn+CA) 累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存在A
    ADDC    A,@Ri     ;A+((Ri))+CA) 累加器A中的内容与工作寄存器Ri指向地址单元中的内容、连同进位位相加,结果存在A

    用途:将A中的值和其后面的值相加,并且加上进位位C中的值。
    说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位的运算范围只有0-255,这在实际工作中是不够的,因此就要进行扩展,一般是将28位的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以到达0-65535。如何合并呢?其实很简单,让我们看一个十进制数的例子吧:
    66+78
    这两个数相加,我们根本不在意这个过程,但事实上我们是这样做的:先做6+8(低位),然后再做6+7,这是高位。做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们并没有意识到我们做了两次加法。之所以要分成两次来做,是因为这两个数超过了一位数所能表达的范围(0-9)。
    在做低位时产生了进位,我们做的时候是在适当的位置点一下,然后在做高位加法时将这一点加进去。那么计算机中做16位加法时同样如此,先做低8位的,如果两数相加后产生了进位,也要点一下做个标记,这个标记就职进位位C,在程序状态字PSW中。在进行高位加法是将这个C加进去。
    例如:1067H+10A0H,先做67H+A0H=107H,而107H显然超过了0FFH,因此,最终保存在A中的数是7,而1则到了PSW中的CY位了,换言之,CY就相当于100H。然后再做10H+10H+CY,结果是21H,所以最终的结果是2107H

    [3]. 
    带借位减法指令(4条)
    这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C内容相减,结果送回累加器A中。
    这里我们对借位位C的状态作出说明,在进行减法运算中,CY=1表示有借位,CY=0则无借位。OV=1声明带符号数相减时,从一个正数减去一个负数结果为负数,或者从一个负数中减去一个正数结果为正数的错误情况。在进行减法运算前,如果不知道借位标志位C的状态,则应先对CY进行清零操作。


    SUBB  A,data      ;A-data - CA) 累加器A中的内容与直接地址单元中的内容、连同借位位相减,结果存在A
    SUBB  A,#data     ;A-#data -CA) 累加器A中的内容与立即数、连同借位位相减,结果存在A
    SUBB  A,Rn       ;A-Rn -CA) 累加器A中的内容与工作寄存器中的内容、连同借位位相减,结果存在A
    SUBB  A,@Ri      ;A-((Ri)) -CA) 累加器A中的内容与工作寄存器Ri指向的地址单元中的内容、连同借位位相减,结果存在A

    [4]. 
    乘法指令(1条)
    这个指令的作用是把累加器A和寄存器B中的8位无符号数相乘,所得到的是16位乘积,这个结果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,说明乘积大于0FFFFH65536),否则OV=0,但进位标志位CY总是等于0

    MUL  AB       ;A×BA)和(B) 累加器A中的内容与寄存器B中的内容相乘,结果存在AB

    例:(A=4EH,(B=5DH,执行指令
        MUL  AB
    后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H

    [5].  除法指令(1条)
    这个指令的作用是把累加器A8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A,而余数存在寄存器B中。除法运算总是使OV和进位标志位CY等于0。如果OV=1,表明寄存器B中的内容为00H,那么执行结果为不确定值,表示除法有溢出。

    DIV  AB       ;A÷BA)和(B) 累加器A中的内容除以寄存器B中的内容,所得到的商存在累加器A,而余数存在寄存器B中。


    例如:13/5,其商是2,余数是3。除了以后,商会放在A中,余数放在B中,CUOV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么OV=1

    [6]. 
    1指令(5条)
    5条指令的的功能均为原寄存器的内容加1,结果送回原寄存器。上述提到,加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,执行加1后,结果就会是00H。这组指令共有直接、寄存器、寄存器减间址等寻址方式:

    INC  A          ;A+1→A) 累加器A中的内容加1,结果存在A
    INC  data       ;data+1→data) 直接地址单元中的内容加1,结果送回原地址单元中
    INC  @Ri       ;((Ri))+1→((Ri)) 寄存器的内容指向的地址单元中的内容加1,结果送回原地址单元中
    INC  Rn         ;Rn+1→Rn)寄存器Rn的内容加1,结果送回原地址单元中
    INC  DPTR      ;DPTR+1→DPTR)数据指针的内容加1,结果送回数据指针中

    用途很简单,就是将后面目标中的值加1
    例:(A=12H,(R0=33H,(21H=32H,(34H=22HDPTR=1234H。执行下面的指令;
    INC  A  
    ;(A=13H
    INC  R0 
    ;(R0=34H
    INC  21H
    ;(21H=33H
    INC  @R0
    ;(34H=23H
    INC  DPTR
    ;(DPTR=1235H
    这些指令执行后的结果都附在了指令的后面。
    说明:从结果上看,INC  AADD A,#1差不多,但INC  A是单字节,单周期指令,而ADD  A,#1则是双字节双周期指令,而且INC  A不会影响PSW位,如(A=0FFHINC  A后(A=00H,而CY依然保持不变。如果是ADD A,#1,则(A=00H,而CY一定是1。因此加1指令并不适合做加法运算,事实上它主要是用来做计数、地址增加等用途。另外,加法类指令都是以A为核心的,其中一个数必须放在A中,而运算结果也必须放在A中,而加1类指令的对象则广泛得多,可以是寄存器、内存地址、间址寻址的地址等等。

    INC  data这条指令中,如果直接地址是I/O,其功能是先读入I/O锁存器的内容,然后在CPU进行加1操作,再输出到I/O上,这就是修改操作。

    [7]. 
    1指令(4条)
    这组指令的作用是把所指的寄存器内容减1,结果送回原寄存器,若原寄存器的内容为00H,减1后即为FFH,运算结果不影响任何标志位,这组指令共有直接、寄存器、寄存器间址等寻址方式,当直接地址是I/O口锁存器时,修改操作与加1指令类似。

    DEC  A         ;A-1→A)累加器A中的内容减1,结果送回累加器A
    DEC  data      ;data-1→data)直接地址单元中的内容减1,结果送回直接地址单元中
    DEC  @Ri      ;((Ri))-1→((Ri))寄存器Ri指向的地址单元中的内容减1,结果送回原地址单元中

    DEC  Rn      ;Rn-1→Rn)寄存器Rn中的内容减1,结果送回寄存器Rn

    [8]. 
    十进制调整指令(1条)
    在进行BCD码运算时,这条指令总是跟在ADDADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。

    DA      A

    综合练习:
       MOV   A,#12H
       MOV   R0,#24H
       MOV   21H,#56H
       ADD   A,#12H
       MOV   DPTR,#1234H
       ADD   A,DPH
       ADD   A,R0
       CLR   C
       SUBB  A,DPL
       SUBB  A,#25H
       INC   A
       SETB  C
       ADDC  A,21H
       INC   R0
       SUBB  A,R0
       MOV   24H,#16H
       CLR   C
       ADD   A,@R0
    先写出每步运行结果,然后将以上题目键入,并在软件仿真中运行,观察寄存器及有关单元的内容的变化。看结果是否与预想的结果相同?

     

    上一篇: 数据传送类指令分析
    下一篇: 伪指令分析
    本公司不接受任何形式的推销,只接受电子邮件。如有需求会主动联系。请西安本地的公司自重!
    地址:陕西省西安市高新区高新路88号尚品国际6幢 邮箱:xibaotegong@aliyun.com
    Copyright © 2018  西安西保特工电力自动化有限公司 版权所有