C51最全111条汇编指令合集,以及使用时的注意事项,超详细

direct 以地址来命名的变量
所有的变量都需要放到一个存储单元中,这个存储单元都一定有一个地址
特别注意!!!!!寄存器的名字单独写出就代表了把该寄存器中的数据,即它就代表其里面的内容,而不是他的地址
要注意所有的指令只能对哪些操作数使用,注意指令的使用范围

指令中直接给出操作数地址(dir)的寻址方式称为直接寻址。寻址对象为:1 内部数据存储器,在指令中以直接地址表示;2特殊功能寄存器SFR,在指令中用寄存器名称表示。
以寄存器中的内容为地址,该地址的内容为操作数的寻址方式称为寄存器间接寻址。能够进行寄存器间接寻址的寄存器有:R0、R1、DPTR,用前面加@表示,如@R0、@R1、@DPTR。寄存器间接寻址的存储空间包括内部数据存储器和外部数据存储器。由于内部数据存储器共有128字节,因此用一字节的R0和R1可间接寻址整个空间。而外部数据存储器最大可达64K,仅R0或R1无法寻址整个空间,为此需要由P2端口提供外部RAM高8位地址,由R0或R1提供低8位地址,由此共同寻址64K字节范围。也可用16位的DPTR寄存器间接寻址64K字节存储空间
0-ffh地址的RAM段 80h-ffh段RAM只能用间接寻址进行操作
data 0—30h idata80h–ffh

注意Rn工作寄存器无法直接将Rn中的内容送入Rn中,所以其数据传送类指令少了一个工作寄存器之间的传送

十六位数的传递指令(1条):MOV DPTR,#data16,是一个16位数,而不是地址,地址会编译不通过,而汇编语言中的标号就相当于该条标号后面第一条指令的地址(指以及编译好放在ROM空间了的地址),所以使用时要格外注意

与片外RAM传送数据的指令为MOVX,一旦为MOVX即表示对片外RAM地址进行访问
MOVX A,@Ri
MOVX @Ri,A
MOVX A,@DPTR
MOVX @DPTR,A
且只有这四条指令?
在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。
在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行

读程序存储器指令(2条):MOVC一旦使用表示访问ROM空间,读取其中的内容,而前面的MOV并未去读ROM里面的内容
MOVC A,@A+DPTR
MOVC A,@A+PC
本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格。
说明:
查找到的结果被放在A中,因此,本条指令执行前后,A中的值是不相同的。

交换指令(5条)
注意!!!(第一操作数只能为A)
XCH A, Rn ;A←→Rn(整字节交换)
XCH A, direct ;A←→(direct)
XCH A, @Ri ;A←→(Ri)
XCHD A, @Ri ;A.3~A.0←→(Ri).3~(Ri).0(低半字节内容交换)
SWAP A ;A.3~A.0←→A.7~A.4(累加器A高低四位数据的交换)

算术运算类指令(24条):
不带进位位的加法指令(4条):(将A中的内容和第二操作数中的内容相加然后送入A中去,注意寻址方式的不同,导致的结果的不同)
ADD A,#data ; A+data→A
ADD A,direct ; A+(direct )→A
ADD A,Rn ; A+Rn→A
ADD A,@Ri ; A+(Ri)→A

带进位位的加法指令(4条):(加上CY位的值)
ADDC A,Rn ;A+Rn+CY→A
ADDC A,direct ;A+(direct )+CY→A
ADDC A,@Ri ;A+(Ri)+CY→A
ADDC A,#data ;A+data+CY→A
带进位位的加法指令常用于多字节的加法指令中。

加1指令(5条):
INC A ;A+1→A,影响P标志
INC Rn ;Rn+1→Rn
INC direct ;(direct)+1→(direct)
INC @Ri 😭(Ri))+1→((Ri))
INC DPTR ;DPTR+1→DPTR

十进制调整指令(1条):(将A中的16进制数据改成与之等价的10进制数据值,便于人读取,显示还是16进制值,但是要把它看成与十进制等价的值
DA A
在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。
例:A = 0001 0101 BCD(代表十进制数15)
ADD A,#8 ;执行完之后,A = 1DH
DA A ;调整后,A = 23H

减法指令:
1.带借位的减法指令(4条)
SUBB A,Rn ;A-Rn-CY→A
SUBB A,direct ;A-(direct )-CY→A
SUBB A,@Ri ;A-(Ri)-CY→A
SUBB A,#data ;A-data-CY→A
注意!!!无不带借位位的减法指令,若需要则要先令CY位的值为0即可

2:减1指令(4条)
DEC A ;A-1→A,影响P标志
DEC Rn ;Rn-1→Rn
DEC direct ;(direct)-1→(direct)
DEC @Ri ;(Rn)-1→(Rn)

乘法指令
MUL AB ;A×B → BA
此指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。
在乘积大于FFH时,0V置1,否则OV为0;而CY总是0。

除法指令
DIV AB ;A÷B 商→A 余数→B
此此指令的功能是将A中的8位无符号数除B中的8位无符号数(A/B)。除了以后,商放在A中,余数放在B中。
CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1

逻辑运算类指令(24条)
主要用于对2个操作数按位进行逻辑操作,注意为按位去进行操作,结果送到A或直接寻址单元。
主要操作:
与、或、异或、移位、取反、清零等。
对标志位的影响:
除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。

逻辑或指令(6条)
注意!!!第一操作数无Rn
ORL A,Rn ;A | Rn→A
ORL A,direct ;A |(direct)→ A
ORL A,@Ri ;A |(Ri)→A
ORL A,#data ;A | data→A
ORL direct,A ;(direct) | A→(direct)
ORL direct,#data ;(direct) | data→(direct)

逻辑与指令(6条)
注意!!!第一操作数无Rn
ANL A,Rn ;A & Rn→A
ANL A,direct ;A &(direct)→ A
ANL A,@Ri ;A &(Ri)→A
ANL A,#data ;A & data→A
ANL direct,A ;(direct) & A→(direct)
ANL direct,#data ;(direct) & data→(direct)

逻辑异或指令(6条)
XRL A,Rn ;A ⊕ Rn→A
XRL A,direct ;A ⊕(direct)→ A
XRL A,@Ri ;A ⊕(Ri)→A
XRL A,#data ;A ⊕ data→A
XRL direct,A ;(direct) ⊕ A→(direct)
XRL direct,#data ;(direct) ⊕ data→(direct)

清零与取反指令(2条)
CLR A ; #0 → A,清零指令,将A中的每一位都置零,将结果送入A中
CPL A ; /A → A 取反指令,将A中的每一位都取反,按位取反,将结果送入A中

循环移位指令(4条)
RL A(将A中的8位,从左往右依次循环移动,最高位到最低位来)
RR A
RLC A(将A中的8位,从左往右依次循环移动,此时最高位给CY位,CY位到最低位去了)
RRC A

控制转移类指令(24条):(这类指令非常重要,使用时一定要逻辑清晰)
共有控制程序转移类指令(不包括位操作类的转移指令)。此类指令一般不影响PSW。
包括以下类型:
无条件转移和条件转移
相对转移和绝对转移
长转移和短转移
调用与返回指令

无条件转移类指令(4条):
短转移类指令: AJMP addr11
长转移类指令: LJMP addr16
相对转移指令: SJMP rel
间接转移指令: JMP @A+DPTR
上面的前三条指令,统统理解成:
PC值改变,即跳转到一个标号处(直接给出我们想要跳转的位置的标号处即可)

前三条无条件转移指令的区别:
JMP指令之间的区别:
跳转的范围不同
AJMP addr11 2K
LJMP addr16 64K
SJMP rel -128 ~ 127
指令构成不同
AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。
指令长度不同
原则上LJMP可以代替AJMP和SJMP。
统统理解为PC值改变,即跳转到一个标号处(直接给出我们想要跳转的位置的标号处即可)

间接转移 JMP @A+DPTR 指令
用途也是跳转,转移地址由A+DPTR形成,并直接送入PC。
指令对A、DPTR和标志位均无影响。
本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。
该指令类似于C语言中的 switch(){case:…}语句的功能。
eg:
MOV DPTR,#TAB ;将TAB所在地址送入DPTR
MOV A, R0 ;根据R0中的数决定执行哪个程序
MOV B, #2 ;这里B中的数为什么是2?(AJMP编译成机器码占用两个字节的ROM)
MUL AB ;AB相乘
JMP @A+DPTR ;散转指令
TAB: AJMP L0 ;A=0时执行该语句
AJMP L1 ;A=1时执行该语句
AJMP L2 ;A=2时执行该语句
……
L0: …… ;具体的执行内容
L1: ……
L2: ……

条件转移类指令(8条):
条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令,顺序往下执行

判断A的值转移指令(2条)
JZ rel ;如果A=0,则转移,否则顺序执行。
JNZ rel ;如果A≠0,就转移。
转移到相对于当前PC值的8位移量的地址去。即: 新的PC值=当前PC+偏移量rel
我们在编写汇编语言源程序时,可以直接写成:
JZ 标号 ;即转移到标号处。
比较不相等转移指令(4条)
CJNE A, #data, rel
CJNE A, direct, rel
CJNE Rn, #data, rel
CJNE @Ri, #data, rel
此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。
同样地,使用时,我们可以将rel理解成标号,如果不相等,就转移到我们给出的标号的位置处去

利用CJNE指令,可以判断两数是否相等。
但有时还想得知两数比较之后哪个大,哪个小,CJNE指令也具有这样的功能:
如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。
如果前面的数大,则CY=0,否则CY=1。
因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了

减1条件转移指令(2条):
注意第一操作数只能为Rn和直接地址
DJNZ Rn, rel
DJNZ direct, rel

DJNZ指令的执行过程是这样的:
它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。

调用与返回指令(4条):
注意调用与返回指令与无条件转移指令的区别,调用与返回指令涉及到对SP值的改变,对堆栈的操作
调用指令(2条)
LCALL addr16 ;长调用指令(3字节)
ACALL addr11 ;短调用指令(2字节)
上面两条指令都是在主程序中调用子程序,短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。
使用时可以用:
LCALL 标号 ;标号表示子程序首地址
ACALL 标号
来调用子程序。指令的执行过程是:当前PC压栈,子程序首地址送 PC,实现转移

返回指令(2条)
RET ;子程序返回指令
RETI ;中断子程序返回指令
两者不能交换使用
RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的ACALL下面的一条指令的地址)弹出给PC,实现返回到ACALL下面的那条指令的位置中去
RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零的功能。

空操作指令
NOP
空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。

位操作指令(17条):
MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。
在MCS-51 中,有一部份RAM和一部份SFR是具有位寻址功能的。在进行位处理时, C用作“位累加器” 。

使用时要注意哪些地址空间是可以进行位寻址的

位传送指令 (2条)
MOV C,bit ;bit →C(bit值的是对具体的可以位寻址的地址空间的具体的某一位进行操作)
MOV bit,C ;C →bit
这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。注意:无法直接传递某个数给某个位
例:MOV C,P1.0 ;将P1.0的状态送给C。
MOV P1.0,C ;将C中的状态送到P1.0
脚上去。

位清0指令 (2条)
CLR C ;使C=0
CLR bit ;使指令中的位地址等于0
这组指令的功能是将对应的位清零。

位置1指令 (2条)
SETB C ;使C=1
SETB bit ;使指令中的位地址状态等于1
这组指令的功能是将对应的位置1

位逻辑运算类指令(6条):
位与指令 (2条)
ANL C,bit ;C与指定位的值相与,结果送C
ANL C,/bit ;先将指定的位地址中的值取出后取反,再和Cy相与,结果送回C。
但注意:指定的位地址中的值本身并不发生变化。即bit的值前后并不发生变化

位或指令 (2条)
ORL C,bit ;C与指定位的值相或,结果送C
ORL C,/bit ;先将指定的位地址中的值取出后取反,再和Cy相或,结果送回C。
同样,指定的位地址中的值本身并不发生变化。

位取反指令 (2条)
CPL C ;使C的值取反。
CPL bit ;使指定的位的值取反。

位条件转移指令(5条)

判断C转移指令 (2条)

JC rel
JNC rel
第一条指令的功能是如果C = 1就转移,否则就顺序执行。注意:与JZ A 不同,A=0就跳转
第二条指令则和第一条指令相反,即如果C = 0就转移,否则就顺序执行。

判断位变量转移指令 (3条)
JB bit,rel
JNB bit,rel
JBC bit,rel
第一条指令:如果指定的(bit)=1,则转移,否则顺序执行;
第二条指令功能相反;
第三条指令是如果指定的(bit)=1,则转移,并把该位清0,否则顺序执行。也就是说执行与否该位的最终结果都为0,要特别注意这一点

汇编语言伪指令(写给汇编编译器看的指令,并非指导CPU运行的指令,只是告诉编译器相关内容,编译时并不产生代码)
伪指令解析
ORG addr16
指定该指令之后的指令(或数据块)的起始地址。
END
程序结束标志。END必须放在程序的最后,在END之后的程序不会被编译成机器码。
DB
定义字节(一个字节,也可定义两个字节,编译器不会报错),一般格式为:
标号: DB 字节常数或字符或表达式
DW
定义字(两个字节,eg:‘我’、‘ab’)。一般格式为:
标号: DW 字或字串
DS
定义预留存储区。eg: DS 2,预定两个字节的存储空间,下一条指令空格2个字节开始存储
BIT
定义位变量。一般格式为:
字符名 BIT 位地址,(将位地址赋值给字符名)eg:stop Bit P1.7(对stop的操作就是对P1.7的操作)

EQU
赋值伪指令。一般格式为:
符号名 EQU 数值(功能为给符号赋值,eg zxb EQU 66H,执行后,zxb==66H)
#HIGH / #LOW
取目标代码的高字节/低字节数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

authenticcc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值