【51单片机】111条汇编指令

符号定义

Rn:当前寄存器区的8个工作寄存器(n=0~7)
Ri:当前寄存器区中可作间接寻址寄存器的2个寄存器(i=0 1)
direct:直接地址
#data:包含在指令中的8位立即数
rel:相对转移指令中的偏移量,为8位带符号补码数
DPTR:数据指针,16位数据地址寄存器

PC:程序寄存器,存有正在执行的指令的地址
bit:直接寻址位
C:进位标志位
addr11:11位目的地址
addr16:16位目的地址
@:间接寻址寄存器前缀

一、数据传送类指令  28条

1.以累加器为目标的操作指令

MOV   A,Rn           //将寄存器Rn中的数据传送到累加器,Rn中的数据不变

MOV   A,@Ri        //将寄存器Ri中的值作为地址,将对应的地址单元的值传送到累加器中,原数据不变

MOV  A,direct       //将直接地址的地址单元中的值传送到累加器中,原数据不变

MOV  A,#data        //将直接数传送给累加器

2.以Rn为目标的操作指令

MOV  Rn,A        //将累加器中的数送入Rn寄存器
MOV  Rn,direct
MOV  Rn,#data

不能传递工作区寄存器数据

不能传递间接寻址数据 

3.以直接地址为目标的操作数指令

MOV  direct,A
MOV  direct,Rn
MOV  direct1,direct2
MOV  direct,@Ri
MOV  direct,#data

所有地址都可以使用

4.以寄存器间接地址为目标的操作指令

MOV @Ri,A                //将累加器中的数据传送到Ri地址单元,源数据不变
MOV @Ri,direct
MOV @Ri,#data

不能传递工作区寄存器数据

不能传递间接寻址数据 

5.16位传送指令

MOV  DPTR,#data16        //将一个16位的立即数送入DPTR中去。其中高8位送入DPH(083H),低8位送入DPL(082H)。

唯一的一条16位立即数传递指令

6.堆栈操作指令

进栈:PUSH direct

出栈:POP direct

7.累加器和外部数据寄存器传送指令

MOVX  A,@DPTR
MOVX  A,@Ri
MOVX  @DPTR,A
MOVX  @Ri,A

8.查表指令

MOVC  A,@A+PC        //变址寻址,将PC中存储的地址加上累计器中的数得到新地址,将改地址单元中的值传送到累加器中。本指令执行前后,累加器中的值改变。
MOVC  A,@A+DPTR

 9.字节交换指令

XCH  A,Rn        //交换累加器和寄存器Rn中的值
XCH  A,direct
XCH  A,@Ri        //交换累加器和Ri中的值对应的地址单元中的值

10.半字节交换指令 

XCHD  A,@Ri        //交换累加器和Ri中的值对应的地址单元中的值,但只交换低半字节数据  

二 、算术操作类指令        24条

1.加法指令

ADD  A,Rn        //将累加器中的值与寄存器Rn中的值相加,计算结果返回累加器。本指令执行完毕,累加器的值前后不同。
ADD  A,direct
ADD  A,@Ri
ADD  A,#data

2.带进位加法指令

ADDC  A,Rn       //将A中的值和其后面的值相加,并且加上进位位C中的值。 
ADDC  A,direct
ADDC  A,@Ri
ADDC  A,#data

3.增加1指令 

INC A        
INC Rn
INC direct
INC @Ri
INC DPTR

从结果上看INC A和ADD A,#1差不多,但INC A是单字节,单周期指令,而ADD #1则是双字节,双周期指令,而且INC A不会影响PSW位。

4.十进制调整指令

DA  A

现在12H+39H,将12H放于A中,执行 ADD A,#39H指令,则结果为4BH,这不是我们希望的51H的数据形式!!这时执行DA A 指令后,就会将A中的数据调整为51H。

5.带借位减法

SUBB  A,Rn
SUBB  A,direct
SUBB  A,@Ri
SUBB  A,#data

包含进位位的减法

没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将C清零即可。 

6.减1指令

DEC  A
DEC  Rn
DEC  direct
DEC  @Ri

7.乘法指令

MUL  AB        //将A和B中的两个8位无符号数相乘

两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFFFFH(65535)时,OV置1(溢出),否则OV为0,而C总是0。

8.除法指令

DIV  AB        //将A中的8位无符号数除以B中的8位无符号数(A/B)

除了以后,商放在A中,余数放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么OV=1。 

三、逻辑操作类指令        25条

1.简单逻辑操作指令

累加器A清零:
CLR  A
累加器A按位取反:
CPL  A

2.左循环指令

RL  A         //将A中的值逻辑左移

逻辑左移时,最高位丢失,最低位补0 

3.带进位左移指令

RLC  A        //将A中的值加上进位位进行逻辑左移

4.右移指令

RR  A        //将A中的值进行逻辑右移

逻辑右移时,最高位补0,最低位丢失

5.带进位循环指令

RRC  A        //将A中的值加上进位位进行逻辑右移

6.累加器半字节交换指令

SWAP  A        //将A中的值高、低4位交换

7.逻辑与指令

ANL  A,Rn        //A与Rn中的值按位'与',结果送入A中
ANL  A,direct
ANL  A,#data
ANL  A,@Ri
ANL  direct,A
ANL  direct,#data

7.逻辑或指令

ORL  A,Rn        //A和Rn中的值按位'或',结果送入A中
ORL  A,direct
ORL  A,#data
ORL  A,@Ri
ORL  direct,A
ORL  direct,#data

7.逻辑异或指令

XRL  A,Rn        //A和Rn中的值按位'异或',结果送入A中
XRL  A,direct
XRL  A,#data
XRL  A,@Ri
XRL  direct,A
XRL  direct,#data

参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0 

四、控制转移类指令        17条

1.无条件转移指令

AJMP  addr11

2.相对转移指令

SJMP  rel

3.长跳转指令

LJMP addr16

上面的三条指令,如果要仔细分析的话,区别较大,但初学时,可不理会这么多,统统理解成:JMP标号,也就是跳转到一个标号处。

那么他们的区别何在呢?在于跳转的范围不一样。好比跳远,LJMP一下就能跳64K这么远(当然近了更没关系了)。而AJMP最多只能跳2K距离,而SJMP则最多只能跳256这么远。原则上,所有用 SJMP或AJMP的地方都可以用LJMP来替代。因此在初学时,需要跳转时可以全用LJMP,除了一个场合。什么场合呢?先了解一下AJMP,AJMP 是一条双字节指令,也就说这条指令本身占用存储器(ROM)的两个单元。而LJMP则是三字节指令,即这条指令占用存储器(ROM)的三个单元。 

4.间接跳转指令

JMP  @A+DPTR        //变址寻址跳转

5.条件转移指令

若A为0则转移:
JZ  rel
若A非0则转移:
JNZ  rel

6.比较不相等转移指令

CJNE  A,direct,rel        //将A中的值和direct中的值比较,如果两者相等,就顺序执行(执行本指令的下一条指令),如果不相等,就转移到rel
CJNE  A,#data,rel
CJNE  Rn,#data,rel
CJNE  @Ri,#data,rel

7.减1不为0转移指令

DJNZ   Rn,rel        //先将工作寄存器Rn中的数减“1”,判断结果是否为“0”,不为“0”程序就跳转到rel执行,否则,为“0”就不转移,继续执行下一条指令
DJNZ   direct,rel

8.调用子程序指令

ACALL  addr11        //跳转到子程序
LCALL  addr16

9.子程序返回指令

RET

10.中断返回指令

RETI

11.空操作指令

NOP        //延时

五、位操作指令

1.数据位传送指令

MOV  C,bit
MOV  bit,C

2.位变量修改指令

清0:
CLR  C
CLR  bit
求反:
CPL  C
CPL  bit
置1:
SETB  C
SETB  bit

3.位变量逻辑与指令

ANL  C,bit
ANL  C,/bit

3.位变量逻辑或指令

ORL  C,bit
ORL  C,/bit

4.条件转移类指令

JC rel                //如果CY等于1就转移,如果不等于1就顺序执行
JNC rel             //如果CY=0就转移,不等于0就顺序执行
JB bit,rel           //如果指定的bit位中的值是1,则转移,否则顺序执行    
JNB bit,rel        //如果指定的bit位中的值是0,则转移,否则顺序执行
JBC bit,rel        //JBC是判断可位寻址区域内指定位是否为1,为1则跳转到指定位置,并同时清除该位(置0)

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C51单片机是由英特尔公司设计的8051系列单片机的一种,它采用C语言和汇编语言混合编程。汇编指令是C51单片机的指令集合,用于编写汇编程序。 C51单片机汇编指令包含了各种指令,用于执行不同的操作。这些指令包括数据传输指令、算术运算指令、逻辑运算指令、位操作指令、跳转指令、中断指令等等。这些指令可以实现对存储器和寄存器的读写、对数据的运算、逻辑判断、程序的跳转等操作。 在编写汇编程序时,使用汇编指令可以很方便地找到需要的指令,了解指令的功能和使用方法。对于初学者来说,汇编指令可以作为学习的参考资料。 汇编指令的内容一般按照指令的功能分类,每个指令都有对应的助记符、操作码和描述。助记符是指令的缩写形式,操作码是指令的机器码形式,描述是指令的功能和使用说明。 通过熟练掌握汇编指令,可以编写出高效、可靠的汇编程序。同时,还可以根据指令对已有的汇编程序进行修改和优化。但需要注意的是,由于C51单片机汇编指令较为庞大,初学者在使用时可能会感到困惑,因此建议结合学习资料和实践来理解和使用指令。 总而言之,C51单片机汇编指令是学习和编写汇编程序的重要参考资料,它提供了各种指令的功能和使用方法,帮助程序员实现对单片机的控制和操作。对于使用C51单片机进行开发的工程师和学生来说,掌握汇编指令是必不可少的技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值