51单片机的基本运算指令

目录

一、加法指令

1.1 ADD(不带进位标志位的加法,类似与半加器)

1.2 ADDC(带进位标志位的加法,类似与全加器) 

 1.3 INC加一指令

二、减法指令 

 2.1 SUBB(带借位标志位的减法)

2.2 DEC减一指令 

三、乘法指令

3.1 MUL

 四、除法指令

 4.1 DIV

 五、位移指令

 5.1 RL左移指令

5.2 RLC,带进位标志位的左移指令

 5.3 RR右移指令

5.4 RRC,带进位标志位的右移指令

 5.5 字的左移

 六、逻辑运算指令

6.1 ANL

6.2 ORL 

6.3 XRL

七、控制转移类指令

7.1 无条件跳转指令

7.2 有条件跳转指令

八、子程序调用和返回指令

 8.1 子程序调用指令

8.2 子程序返回指令

总结
 


一、加法指令

  加法指令:用于将两个数相加并将结果保存到指定的寄存器或存储器中。包括ADD,ADDC指令。

1.1 ADD(不带进位标志位的加法,类似与半加器)

        ADD的语法格式,如下:

ADD    A,#data8       例: ADD    A,#10
ADD    A,direct            ADD    A,30H
ADD    A,Rn                ADD    A,R3
ADD    A,@Ri               ADD    A,@R0

        观察ADD的使用格式,第一个操作数被限定为累加器A,而源操作数可以为8位的数据,也可以是单元地址,或寄存器,亦或是寄存器间接寻址。下面实现将R0,R1之和保持到R2中,代码如下:

	MOV R0,#30H
	MOV R1,#40H
	MOV A,R0
	ADD A,R1
	MOV R2,A
	END

        不难发现,R2的结果应该为O*30H+O*40H=O*70H,运行代码,观察结果如图所示:

1.2 ADDC(带进位标志位的加法,类似与全加器) 

        ADDC是一种字节加法,而ADDC的语法格式,如下:

ADDC    A,#data8       例: ADDC    A,#10
ADDC    A,direct            ADDC    A,30H
ADDC    A,Rn                ADDC    A,R1
ADDC    A,@Ri               ADDC    A,@R0

         执行ADDC指令后的结果为:A=A+#data+cy——cy为进位标志位。注意低8位的加法使用ADD指令,下面计算O*1255H+O*3122H的加法计算,代码如下:

MOV R0,#55H     ;1255H+3122H 
	MOV A,#22H
	ADD A,R0
	MOV 30H,A       
	MOV R0,#12H
	MOV A,#31H
	ADDC A,R0       
	MOV 31H,A      
	MOV A,#0
	ADDC A,#0       
	MOV 32H,A
	END

        这是一种字的加法,需要分高低次位分开进行运算 ,期间需要考虑有无进位的情况。低8位加法使用ADD指令,计算后可能项高位产生进位;所以在计算高八位的加法时需要使用ADDC指令,计算完成后还需要考虑高位的加法是否会产生进位,这时需要对A置换零,取出cy的值,采用MOV A,#0    ADDC A,#0  实现,结果如图所示:

 1.3 INC加一指令

        INC指令可以与C语言中的++类比,功能上是相同的。INC的语法格式,如下:

INC    A
INC    Rn
INC    @Ri
INC    direct
INC    DPTR

二、减法指令 

        减法指令:用于将一个数减去另一个数并将结果保存到指定的寄存器或存储器中。

 2.1 SUBB(带借位标志位的减法)

        SUBB的语法格式,如下:

SUBB   A,#data8       例:  SUBB   A,#10
SUBB   A,direct             SUBB    A,30H
SUBB    A,Rn                SUBB   A,R3
SUBB    A,@Ri               SUBB    A,@R0

        注意首次使用SUBB指令需要对cy清零,即CLR C。 下面计算O*19H-o*55H,代码如下:

MOV R0,#55H
	MOV A,#19H
	SUBB A,R0     ;A=A-R0-cy
	MOV 30H,A
	MOV A,#0
	ADDC A,#0     
	MOV 31H,A
	END

         小数-大数,会产生借位,计算结果如图所示:

2.2 DEC减一指令 

         DEC指令可以与C语言中的--类比,功能上是相同的。DEC的语法格式,如下:

DEC    A
DEC    Rn
DEC    @Ri
DEC    direct
DEC    DPTR

        注意:不能对DPTR单独减一。 

三、乘法指令

       乘法指令:用于将两个数相乘并将结果保存到指定的寄存器或存储器中。

3.1 MUL

        乘法和除法指令都只有唯一一条,而MUL的语法格式,如下:

MUL AB

         乘法结果的低8位存放到累加器A,高8位存放到寄存器B中,下面计算O*52H  *  O*65H,代码如下:

MOV B,#65H     
	MOV A,#52H
	MUL AB
	MOV 30H,A       
	MOV 31H,B
	END

        结果如图所示:

 

 四、除法指令

        除法指令:用于将一个数除以另一个数并将结果保存到指定的寄存器或存储器中。

 4.1 DIV

       DIV的语法格式,如下:

DIV    AB

        除法的结果:商存放在累加器A中,余数存放到寄存器B中,下面使用DIV指令计算O*66H/O*11H,代码如下:

MOV B,#11H     
	MOV A,#67H     
	DIV AB
	MOV 30H,A       
	MOV 31H,B
	END

        结果如图所示:

 

 五、位移指令

        位移指令:用于对一个数进行左移或右移操作,并将结果保存到指定的寄存器或存储器中。注意,位移类指令只能对累加器A进行移位。数值较小的时候,左移相当于乘2,右移相当于除2。

 5.1 RL左移指令

          RL的语法格式,如下:

RL    A

        左移的实现如图所示:

5.2 RLC,带进位标志位的左移指令

          RLC的语法格式,如下:

RLC    A

        带进位标志位的左移的实现如图所示: 

 5.3 RR右移指令

          RR的语法格式,如下:

RR    A

        右移的实现如图所示: 

5.4 RRC,带进位标志位的右移指令

          RRC的语法格式,如下:

RRC    A

        带进位标志位的右移的实现如图所示:

 5.5 字的左移

        将O*7496H进行左移,将O*7496H转为二进制是:01110100  10010110 ,进行左移后(带cy)的结果为:0(cy)  11101001  00101100。换算16进制为:O*E92CH。过程图如下:代码如下:


MAIN:
	MOV R0,#96H   ;R0为低8位
	MOV R1,#74H   ;R1为高8位
	MOV A,R0
	CLR C          
	RLC  A        ;低位左移,低位的最高位进cy  
	MOV R0,A      
	MOV A,R1
	RLC A          ;高位左移,低位的最高位进高位的最低位,高位的最高位进cy
	MOV R1,A
	END

         结果如图所示:

 六、逻辑运算指令

        逻辑运算指令:包括与、或、非、异或等逻辑运算指令,用于对两个数进行逻辑运算,并将结果保存到指定的寄存器或存储器中。

6.1 ANL

        按与指令ANL,即:有0则0,无0为1,可用于清零。ANL的语法格式,如下:

ANL   A,#data8       
ANL   A,direct             
ANL   A,Rn                
ANL   A,@Ri   

6.2 ORL 

        按位或指令ORL,即:有1则1,无1为0,可用于置一。ORL的语法格式,如下:

ORL   A,#data8       
ORL   A,direct             
ORL   A,Rn                
ORL   A,@Ri  

6.3 XRL

        按位异或指令XRL,即:不同为1,可用于取反。XRL的语法格式,如下:

XRL   A,#data8       
XRL   A,direct             
XRL   A,Rn                
XRL   A,@Ri  

七、控制转移类指令

7.1 无条件跳转指令

        无条件跳转指令的操作数是单目操作数,无条件跳转指令包含以下:

  • SJMP ——短跳转,范围:-128——127
  • AJMP——相对跳转,范围:2KB
  • LJMP——长跳转,范围:64KB

7.2 有条件跳转指令

       有条件跳转指令包含以下:

  • JC——无进位/借位则跳转,cy=0
  • JNC——有进位/借位则跳转,cy=1
  • JZ——为零则跳转
  • JNZ——不为零则跳转
  • JB——判断该位为1则转移
  • JNB——判断该位为0则转移
  • JBC——判断该位为1则转移,同时将该位置0
  • CJNE——比较不等则跳转指令,三目操作符,
    • CJNE Rn,#data8,rel(跳转名称)
    • CJNE A,#data8,rel
    • CJNE A,direct,rel
  • DJNZ——减一不为0则跳转指令 

八、子程序调用和返回指令

 8.1 子程序调用指令

  •       ACALL——短调用,范围:2KB
  •       LCALL——长调用,范围:64KB

8.2 子程序返回指令

  •         RET——子程序返回指令,也是子程序的结束
  •         RETI——中断子程序返回指令,也是中断服务子程序的结束

总结

        本文单介绍了51单片机的基本运算指令,具体运用依照实际情况来看。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值