MCS-51 汇编指令集
CJNE A,direct,rel ;if(direct)<(A),PC←(PC)+3+rel,and CY←0 ;CJNE compare instruction
; ;if(direct)>(A),PC←(PC)+3+rel,and CY←1
; ;if(direct)=(A),PC←(PC)+3,and CY←0
; CJNE A,#data,rel ;ifdata<(A),PC←(PC)+3+rel,and CY←0
; ;ifdata>(A),PC←(PC)+3+rel,and CY←1
; ;ifdata=(A),PC←(PC)+3,and CY←0
; CJNE Rn,#data,rel ;ifdata<(Rn),PC←(PC)+3+rel,and CY←0
; ;ifdata>(Rn),PC←(PC)+3+rel,and CY←1
; ;ifdata=(Rn),PC←(PC)+3,and CY←0
; CJNE @Ri,#data,rel ;ifdata<((Ri)),PC←(PC)+3+rel,and CY←0
; ;ifdata>((Ri)),PC←(PC)+3+rel,and CY←1
; ;ifdata=((Ri)),PC←(PC)+3,and CY←0
CJNE是比较转移指令,该指令通过比较前面两个操作数的大小,如果它们的值不相等则转移,相等则继续执行。指令执行后要影响进位位CY,若操作数1小于操作数2,则CY=1;若操作数1大于操作数2,则CY=0
8种常用伪指令
1.ORG 16位地址 ;此指令用在原程序或数据块的开始,指明此语句后
面目标程序或数据块存放的起始地址。
2.[标号:] DB 字节数据项表 ;将项表中的字节数据存放到从标号开始的连续字
节单元中。例如:SEG: DB 88H,100,“7”,“C”
3.[标号:]DW 双字节数据项表 ;定义16位地址表,16地址按低位地址存低位字
节,高位地址存高位字节。
例如:TAB: DW 1234H,7BH
4.名字 EQU 表达式 或名字=表达式 ;用与给一个表达式赋值或给字符串起名字。之
后名字可用做程序地址,数据地址或立即数地址
使用。名字必须是一字母开头的字母数字串。
例如:COUNT=10 或 SPACE EQU 10H
5.名字 DATA 直接字节地址 ;给8位内部RAM单元起个名字,名字必须是一
字母开头的字母数字串。同一单元可起多个名字。
例如:ERROR DATA 80H
6.名字 XDATA 直接字节地址 ;给8位外部RAM起个名字,名字规定同DATA
伪指令。例如:IO_PORT XDATA 0CF04H
7.名字 BIT 位指令 ;给一可位寻址的位单元起个名字,规定同DATA
伪指令。例如:SWT BIT 30H
8.[标号:] END ;指出源程序到此结束,汇编对其后的程序语句不
予理睬.源程序只在主程序最后使用一个END
定义指令符号
符号 |
说明 |
Rn |
目前所选定的寄存器组中的R0-R7寄存器 |
Ri |
当前选中的寄存器区中可作为地址寄存器的两个寄存器R0和R1(i=0,1) |
Direct |
8位直接寻址地址,可以是内存RAM地址(00H--7FH)或SFR(80H--FFH) |
@Ri |
通过R0或R1做间接寻址内部RAM的地址(00H--FFH)的前缀 |
#data |
8位立即数 |
#data16 |
16位立即数,只有DPTR中才用到 |
Addr 16 |
只用在LCALL(长指令调用,三字节)和LJMP(无条件长转移指令)指令中的16位目的地地址,可寻址64K存储器中的任何地址 |
Addr 11 |
使用在ACALL(绝对调用指令,双字节)和AJMP(无条件绝对转移指令)指令中的11位目的地地址,可寻址下一个指令算起2K内的任何地址,即目的地址必须放在与下条指令第一个字节同一个2kB程序存储器空间 |
DPTR |
数据指针 |
rel |
有符号的8位偏移地址(Offset Address),其范围是从下一个指令算起的-128到+128字节中。负值表示地址向前推算,正值表示地址向后推算。使用在SJMP和所有条件式跳转指令中 |
bit |
可直接位寻址的内部数据RAM(20H--2FH),其中地址范围为(00H--7FH)或特殊功能积存器(80H--FFH) |
A |
累加器 |
B |
累加器,用于乘法和除法 |
(X) |
某地址单元X中的内容 |
((X)) |
某地址单元X内存放一地址信息,此命令为寻址地址信息所指地址中存放的数据 |
MCS51汇编指令
指令格式(助记符) |
指令功能说明 |
字节 |
周期 |
MOV A,direct |
(direct)→(A) 直接单元地址中的数据→累加器A |
1 |
1 |
MOV A,#data |
#data→(A) 8位立即数→累加器A |
2 |
1 |
MOV A,Rn |
(Rn )→(A) Rn寄存器中的数据→累加器A |
1 |
1 |
MOV A,@Ri |
((Ri))→(A) Ri中的数据指向的地址单元中的数据 →累加器A |
1 |
1 |
MOV Rn,direct |
(direct)→(Rn) 直接寻址单元中的数据 —> 寄存器Rn |
2 |
2 |
MOV Rn,#data |
#data→(Rn) 8位立即数 —> 寄存器Rn |
2 |
1 |
MOV Rn,A |
(A)→(Rn) 累加器A中的数据 —> 寄存器Rn |
1 |
1 |
MOV direct,direct |
(direct)→(direct) 直接地址单元中的数据→直接地址单元direct |
3 |
2 |
MOV direct,#data |
#data→(direct) 立即数→直接地址单元direct |
3 |
2 |
MOV direct,A |
(A)→(direct) 累加器A中的数据→直接地址单元direct |
2 |
2 |
MOV direct,Rn |
(Rn)→(direct) 寄存器Rn中的数据→直接地址单元direct |
2 |
2 |
MOV direct,@Ri |
((Ri))→(direct) 寄存器Ri中的数据指定的地址单元中数据→直接地址单元direct |
2 |
2 |
MOV @Ri,direct |
(direct)→((Ri)) 直接地址单元中的数据→以Ri中的内容为地址的RAM单元 |
2 |
2 |
MOV @Ri,#data |
#data→((Ri)) 立即数→以Ri中的内容为地址的RAM单元 |
2 |
1 |
MOV @Ri,A |
(A)→((Ri)) 累加器A中的数据→以Ri中的内容为地址的RAM单元 |
1 |
1 |
MOVC A,@A+DPTR |
((A))+(DPTR)→(A) 表格地址单元中的数据→累加器A |
3 |
2 |
MOVC A,@A+PC |
((PC))+1→(A),((A))+(PC)→(A) 表格地址单元中的数据→累加器A |
1 |
2 |
MOVX @DPTR,A |
(A)→((DPTR)) 累加器中的数据→数据指针指向片外RAM地址中 |
3 |
2 |
MOVX A, @DPTR |
(A)→((DPTR)) 累加器中的数据 → 数据指针指向片外RAM地址中 |
3 |
2 |
MOVX A, @Ri |
((Ri))→(A) 寄存器Ri指向片外RAM地址中的数据→累加器A中 |
1 |
2 |
MOVX @Ri,A |
(A)→((Ri)) 累加器中的数据→寄存器Ri指向片外RAM地址中 |
1 |
2 |
PUSH direct |
(SP)+1→(SP),(direct)→(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中 |
2 |
2 |
PUSH A |
将累加器A中的数据→堆栈顶端 |
2 |
2 |
POP direct |
(SP)→(direct)(SP)-1→(SP), 堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作 |
2 |
2 |
POP A |
将堆栈顶端的数据→累加器A |
2 |
2 |
XCH A,Rn |
(A)←→(Rn)累加器与工作寄存器Rn中的数据互换 |
1 |
1 |
XCH A,@Ri |
(A)←→((Ri))累加器与工作寄存器Ri所指的存储单元中的数据互换 |
1 |
1 |
XCH A, direct |
(A)←→(direct)累加器与直接地址单元中的内容互换 |
2 |
2 |
XCHD A,@Ri |
(A3-0)←→((Ri)3-0)累加器与工作寄存器Ri所指的存储单元中的数据低半字节互换 |
1 |
1 |
SWAP A |
(A3-0)←→(A7-4)累加器中的内容高低半字节互换 |
1 |
1 |
MOV DPTR,#data16 |
#dataH→(DPH),#dataL→(DPL)16位常数的高8位送到DPH,低8位送到DPL |
3 |
2 |
ADD A,#data |
A)+#data→(A) 累加器A中的数据与立即数#data相加,结果存在A中 |
2 |
1 |
ADD A,direct |
A)+(direct)→(A) 累加器A中的数据与直接地址单元中的数据相加,结果存在A中 |
2 |
1 |
指令格式(助记符) |
指令功能说明 |
字节 |
周期 |
ADD A,Rn |
(A)+(Rn)→(A) 累加器A中的数据与工作寄存器Rn中的数据相加,结果存在A中 |
1 |
1 |
ADD A,@Ri |
(A)+((Ri))→(A) 累加器A中的数据与工作寄存器Ri所指向地址单元中的数据相加,结果存在A中 |
1 |
1 |
ADDC A,direct |
(A)+(direct)+(C)→(A) 累加器A中的数据与直接地址单元的数据连同进位位相加,结果存在A中 |
2 |
1 |
ADDC A,#data |
(A)+#data +(C)→(A) 累加器A中的数据与立即数连同进位位相加,结果存在A中 |
2 |
1 |
ADDC A,Rn |
A)+Rn+(C)→(A) 累加器A中的数据与工作寄存器Rn中的数据、连同进位位相加,结果存在A中 |
1 |
1 |
ADDC A,@Ri |
(A)+((Ri))+(C)→(A) 累加器A中的数据与工作寄存器Ri指向地址单元中的数据、连同进位位相加,结果存在A中 |
1 |
1 |
SUBB A,direct |
(A)-(direct)-(C)→(A) 累加器A中的数据与直接地址单元中的数据、连同借位位相减,结果存在A中 |
2 |
1 |
SUBB A,#data |
(A)-(Rn)-(C)→(A) 累加器A中的数据与工作寄存器中的数据、连同借位位相减,结果存在A中 |
2 |
1 |
SUBB A,Rn |
(A)-(Rn)-(C)→(A) 累加器A中的数据与工作寄存器中的数据、连同借位位相减,结果存在A中 |
1 |
1 |
SUBB A,@Ri |
(A)-((Ri))-(C)→(A) 累加器A中的数据与工作寄存器Ri指向的地址单元中的数据、连同借位位相减,结果存在A中 |
1 |
1 |
MUL AB |
(A)×(B)→(A)和(B) 累加器A中的数据乘以寄存器B中的数据,结果高字节存入寄存器B,底字节存入累加器A |
1 |
4 |
DIV AB |
(A)÷(B)→(A)和(B) 累加器A中的数据除以寄存器B中的数据,结果的商存入累加器A,余数存入寄存器B中 |
1 |
4 |
INC A |
+1¡ú(A) 累加器A中的数据加1,结果存在A中 |
1 |
1 |
INC direct |
(direct)+1→(direct) 直接地址单元中的数据加1,结果送回原地址单元中,如果直接地址是I/O,其功能是先读入I/O锁存器的内容,然后在CPU进行加1操作,再输出到I/O上,这就是“读—修改—写”操作 |
2 |
1 |
INC @Ri |
((Ri))+1→((Ri)) 寄存器的数据指向的地址单元中的数据加1,结果送回原地址单元中 |
1 |
1 |
NC Rn |
Rn)+1→(Rn)寄存器Rn的数据加1,结果送回原地址单元 |
1 |
1 |
INC DPTR |
(DPTR)+1→(DPTR)数据指针的数据加1,结果送回数据指针中 |
1 |
2 |
DEC A |
(A)-1→(A)累加器A中的数据减1,结果送回累加器A |
1 |
1 |
DEC direct |
(direct)-1→(direct)直接地址单元中的数据减1,结果送回直接地址单元中 |
2 |
1 |
DEC @Ri |
((Ri))-1→((Ri))寄存器Ri指向的地址单元中的数据减1,结果送回原地址单元中 |
1 |
1 |
DEC Rn |
(Rn)-1→(Rn)寄存器Rn中的数据减1,结果送回寄存器Rn中 |
1 |
1 |
DA A |
累加器A中的数据做BCD调整 |
1 |
1 |
RL A |
累加器A中的数据左移一位,bit7¡úbit0 |
1 |
1 |
RR A |
累加器A中的数据右移一位,bit7¡úbit7 |
1 |
1 |
RLC A |
累加器A中的数据连同进位标志位CY左移一位,bit7¡úCY,CY¡úbit0 |
1 |
1 |
RRC A |
累加器A中的数据连同进位CY位CY右移一位,bi0¡úCY,CY¡úbit7 |
1 |
1 |
SWAP A |
累加器中的数据高低半字节互换 |
1 |
1 |
CPL A |
累加器中的数据按位取反,即0¡ú1,1¡ú0 |
1 |
1 |
CLR A |
0¡ú(A),累加器中的数据清0H |
1 |
1 |
ANL A,direct |
累加器A中的数据和直接地址单元中的数据执行与操作。结果存在寄存器A中 |
2 |
1 |
ANL direct,#data |
直接地址单元中的数据和立即数执行与操作。结果存在直接地址单元中 |
3 |
2 |
指令格式(助记符) |
指令功能说明 |
字节 |
周期 |
NL A,#data |
累加器A的数据和立即数执行与操作。结果存在累加器A中 |
2 |
1 |
NL A,Rn |
累加器A的数据和寄存器Rn中的数据执行与操作。结果存在累加器A中 |
1 |
1 |
ANL direct,A |
直接地址单元中的数据和累加器A的数据执行与操作。结果存在直接地址单元中 |
2 |
1 |
ANL A,@Ri |
累加器A的数据和工作寄存器Ri指向的地址单元中的数据执行与操作。结果存在累加器A中 |
1 |
1 |
ORL A,direct |
累加器A中的数据和直接地址单元中的数据执行逻辑或操作。结果存在寄存器A中 |
2 |
1 |
ORL direct,#data |
累加器A中的数据和直接地址单元中的数据执行逻辑或操作。结果存在寄存器A中 |
3 |
2 |
ORL A,#data |
累加器A的数据和立即数执行逻辑或操作。结果存在累加器 |
2 |
1 |
ORL A,Rn |
累加器A的数据和寄存器Rn中的数据执行逻辑或操作。结果存在累加器A中 |
1 |
1 |
ORL direct,A |
直接地址单元中的数据和累加器A的数据执行逻辑或操作。结果存在直接地址单元中 |
2 |
1 |
ORL A,@Ri |
累加器A的数据和工作寄存器Ri指向的地址单元中的数据执行逻辑或操作。结果存在累加器A中 |
1 |
1 |
XRL A,direct |
累加器A中的数据和直接地址单元中的数据执行逻辑异或操作。结果存在寄存器A中 |
2 |
1 |
XRL direct,#data |
直接地址单元中的数据和立即数执行逻辑异或操作。结果存在直接地址单元中 |
3 |
2 |
XRL A,#data |
累加器A的数据和立即数执行逻辑异或操作。结果存在累加器A中 |
2 |
1 |
XRL A,Rn |
累加器A的数据和寄存器Rn中的数据执行逻辑异或操作。结果存在累加器A中 |
1 |
1 |
XRL data,A |
直接地址单元中的数据和累加器A的数据执行逻辑异或操作。结果存在直接地址单元中 |
2 |
1 |
XRL A,@Ri |
累加器A的数据和工作寄存器Ri指向的地址单元中的数据执行逻辑异或操作。结果存在累加器A中 |
1 |
1 |
CLR C |
清除进位标志CY为0 |
1 |
1 |
CLR bit |
清除bit为0 |
2 |
1 |
SETB C |
设定进位标志CY为1 |
1 |
1 |
SETB bit |
设定bit为1 |
2 |
1 |
CPL C |
将进位标志CY反相 |
1 |
1 |
CPL bit |
将bit反相 |
2 |
1 |
ANL C,bit |
将进位标志CY AND bit值¡ú进位标志位CY |
2 |
2 |
ANL C,/bit |
将进位标志CY AND bit反相值¡ú进位标志位CY |
2 |
2 |
ANL A,#data |
将累加器A的各位与立即数的相对位置做AND¡úA累加器 |
2 |
2 |
ORL C,bit |
将进位标志CY OR bit值¡ú进位标志位CY |
2 |
2 |
ORL C,/bit |
将进位标志CY OR bit反相值¡ú进位标志位CY |
2 |
2 |
ORL A,#data |
将累加器A的各位与立即数的相对位置做OR¡úA累加器 |
2 |
2 |
MOV C,bit |
将bit值¡ú进位标志位CY |
2 |
1 |
MOV bit,C |
将进位标志位CY¡úbit值 |
2 |
2 |
JC rel |
当进位标志位CY=1就跳至rel,否则执行下一条指令 |
2 |
2 |
JNC rel |
当进位标志位CY=0就跳至rel,否则执行下一条指令 |
2 |
2 |
JB bit rel |
当进bit=1就跳至rel,否则执行下一条指令 |
3 |
3 |
JNB bit rel |
当进bit=0就跳至rel,否则执行下一条指令 |
3 |
3 |
JBC bit rel |
当进bit=1跳至rel,并且清除此bit为0,否则执行下一条指令 |
3 |
3 |
ACALL addr11 |
2K范围内子程序调用 |
2 |
2 |
LCALL addr16 |
64K范围内子程序调用 |
3 |
3 |
RET |
子程序返回 |
1 |
2 |
RET1 |
中断服务程序结束返回 |
1 |
2 |
指令格式(助记符) |
指令功能说明 |
字节 |
周期 |
AJMP addr11 |
2K范围内无条件跳转 |
2 |
2 |
LJMP addr16 |
64K范围内无条件跳转 |
2 |
2 |
SJMP rel |
在此指令的前128或后128范围内无条件跳转 |
2 |
2 |
JMP @A+DPTR |
跳至@A+DPTR所指定的地址 |
1 |
2 |
JZ rel |
如A的内容为0,则短跳转,负责执行下一条指令 |
2 |
2 |
JNZ rel |
如A的内容不为0,则短跳转,负责执行下一条指令 |
2 |
2 |
CJNE A,direct,rel |
如A的内容与直接地址内的数据不同,则短跳转 |
3 |
2 |
CJNE A,#data,rel |
如A的内容与立即数不同,则短跳转 |
3 |
2 |
CJNE Rn,#data,rel |
如Rn寄存器中的数据与立即数不同,则短跳转 |
3 |
2 |
CJNE @Ri,#data,rel |
如间接地址的数据与立即数不同,则短跳转 |
3 |
2 |
DJNZ Rn,rel |
Rn寄存器中的数据减1,若不为0,则短跳转,否则执行下条指令 |
2 |
2 |
DJNZ direct,rel |
直接地址中的数据减1,若不为0,则短跳转,负责执行下条指令 |
3 |
2 |
NOP |
CPU仅仅作取指令,不动作 |
1 |
1 |