您现在的位置是:首页 > 单片机

MCS-51算术运算指令

2019-12-24 21:03:41

算术运算指令共有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)+(data)→(A) 累加器A中的内容与直接地址单元中的内容相加,结果存在A中
        ADD  A,Rn     ;(A)+(Rn)→(A) 累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中
        ADD  A,@Ri    ;(A)+((Ri))→(A) 累加器A中的内容与工作寄存器Ri所指向地址单元中的内容相加,结果存在A中

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

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

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


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

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

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

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

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

    [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,结果送回数据指针中

        在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码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。

        DA  A