目录
一、加法指令
加法指令:用于将两个数相加并将结果保存到指定的寄存器或存储器中。包括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单片机的基本运算指令,具体运用依照实际情况来看。