C51汇编指令
8中常用伪指令
①. ORG 16位地址
此指令用在原程序或数据块的开始,指明此语句后面目标程序或数据块存放的起始地址。
ORG 000H
②. [标号:] DB 字节数据项表
将项表中的字节数据存放到从标号开始的连续字节单元中。
SEG: DB 88H,100,“7”,“C”
③. [标号: ] DW 双字节数据项表
定义16 位地址表, 16 地址按低位地址存低位字节,高位地址存高位字节。
TAB: DW 1234H,7BH
④. 名字 EQU 表达式 或 名字=表达式
用与给一个表达式赋值或给字符串起名字。之后名字可用做程序地址,数据地址或立即数地址使用。名字必须是一字母开头的字母数字串。
COUNT=10 或 SPACE EQU 10H
⑤. 名字 DATA 直接字节地址
给8 位内部RAMm单元起个名字,名字必须是一字母开头的字母数字串。同一单元可起多个名字。
ERROR DATA 80H
⑥. 名字 XDATA 直接字节地址
给8 位外部RAM起个名字,名字规定同DATA 伪指令。
IO_PORT XDATA 0CF04H
⑦. 名字 BIT 位指令
给一可位寻址的位单元起个名字,规定同DATA伪指令。
SWT BIT 30H
⑧. [标号:] 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 中才用到 |
Addr16 | 只用在LCALL(长指令调用,三字节)和LJMP(无条件长转移指令)指令中的16位目的地地址,可寻址64K 存储器中的任何地址 |
Addr11 | 使用在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内存放一地址信息,此命令为寻址地址信息所指地址中存放的数据 |
汇编指令
指令格式(助记符) | 指令功能说明 |
---|---|
MOV A,direct | (direct) →(A) 直接单元地址中的数据→累加器A |
MOV A,#data | #data → (A) 8 位立即数→累加器A |
MOV A,Rn | (Rn) →(A) Rn 寄存器中的数据→累加器A |
MOV A,@Ri | ((Ri)) →(A) Ri 中的数据指向的地址单元中的数据→累加器A |
MOV Rn,direct | (direct) →(Rn) 直接寻址单元中的数据—> 寄存器Rn |
MOV Rn,#data | #data → (Rn) 8 位立即数—> 寄存器Rn |
MOV Rn,A | (A) →(Rn) 累加器A 中的数据—> 寄存器Rn |
MOV direct,direct | (direct) →(direct) 直接地址单元中的数据→直接地址单元direct |
MOV direct,#data | #data → (direct) 立即数→直接地址单元direct |
MOV direct,A | (A) →(direct) 累加器A中的数据→直接地址单元direct |
MOV direct,Rn | (Rn) →(direct) 寄存器Rn 中的数据→直接地址单元direct |
MOV direct,@Ri | ((Ri)) →(direct) 寄存器Ri 中的数据指定的地址单元中数据→直接地址单元direct |
MOV @Ri,direct | (direct) →((Ri)) 直接地址单元中的数据→以Ri 中的内容为地址的RAM单元 |
MOV @Ri,#data | #data → ((Ri)) 立即数→以Ri 中的内容为地址的RAM单元 |
MOV @Ri,A | (A) →((Ri)) 累加器A 中的数据→以Ri 中的内容为地址的RAM单元 |
MOVC A,@A+DPTR | ((A))+(DPTR) →(A) 表格地址单元中的数据→累加器A |
MOVC A,@A+PC | ((A))+(PC) →(A) 表格地址单元中的数据→累加器A |
MOVX @DPTR,A | (A) →((DPTR)) 累加器中的数据→ 数据指针指向片RAM地址中 |
MOVX A, @DPTR | (A) →((DPTR)) 累加器中的数据→ 数据指针指向片RAM地址中 |
MOVX A, @Ri | ((Ri)) →(A) 寄存器Ri 指向片外RAM 地址中的数据→累加器A中 |
MOVX @Ri,A | (A) →((Ri)) 累加器中的数据→ 寄存器Ri 指向片外RAM地址中 |
PUSH direct | (SP) +1→(SP) ,(direct) →(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP 所指的单元中 |
PUSH A | 将累加器A 中的数据→堆栈顶端 |
POP direct | (SP) →(direct) (SP)- 1→(SP) 堆栈指针SP 所指的单元数据送到直接寻址单元中,堆栈指针SP 再进行减1操作 |
POP A | 将堆栈顶端的数据→累加器A |
XCH A,Rn | (A) ←→(Rn) 累加器与工作寄存器Rn 中的数据互换 |
XCH A,@Ri | (A) ←→((Ri)) 累加器与工作寄存器Ri 所指的存储单元中的数据互换 |
XCH A, direct | (A) ←→(direct) 累加器与直接地址单元中的内容互换 |
XCHD A,@Ri | (A 3-0 ) ←→((Ri) 3-0 ) 累加器与工作寄存器Ri 所指的存储单元中的数据低半字节互换 |
SWAP A | (A 3-0 ) ←→(A 7-4 ) 累加器中的内容高低半字节互换 |
MOV DPTR,#data16 | #dataH → (DPH) , #dataL → (DPL) 16 位常数的高8 位送到DPH,低8 位送到DPL |
ADD A,#data | (A) +#data → (A) 累加器A 中的数据与立即数#data 相加,结果存在A 中 |
ADD A,direct | (A)+ (direct) →(A) 累加器A 中的数据与直接地址单元中的数据相加,结果存在A 中 |
ADD A,Rn | (A)+(Rn) →(A) 累加器A 中的数据与工作寄存器Rn 中的数据相加,结果存在A 中 |
ADD A,@Ri | (A)+((Ri)) →(A) 累加器A 中的数据与工作寄存器Ri 所指向地址单元中的数据相加,结果存在A 中 |
ADDC A,direct | (A)+(direct)+(C) →(A) 累加器A 中的数据与直接地址单元的数据连同进位位相加,结果存在A 中 |
ADDC A,#data | (A)+#data +(C) →(A) 累加器A 中的数据与立即数连同进位位相加,结果存在A 中 |
ADDC A,Rn | (A)+Rn+(C) →(A) 累加器A 中的数据与工作寄存器Rn 中的数据、连同进位位相加,结果存在A 中 |
ADDC A,@Ri | (A)+((Ri))+(C) →(A) 累加器A 中的数据与工作寄存器Ri 指向地址单元中的数据、连同进位位相加,结果存在A 中 |
SUBB A,direct | (A) - (direct) -(C) →(A) 累加器A 中的数据与直接地址单元中的数据、连同借位位相减,结果存在A 中 |
SUBB A,#data | (A) - (Rn) - (C) →(A) 累加器A 中的数据与工作寄存器中的数据、连同借位位相减,结果存在A 中 |
SUBB A,Rn | (A) - (Rn) - (C) →(A) 累加器A 中的数据与工作寄存器中的数据、连同借位位相减,结果存在A 中 |
SUBB A,@Ri | (A) - ((Ri)) - (C) →(A) 累加器A 中的数据与工作寄存器Ri 指向的地址单元中的数据、连同借位位相减,结果存在A 中 |
MUL AB | (A) × (B) →(A) 和(B) 累加器A 中的数据乘以寄存器B 中的数据,结果高字节存入寄存器B,底字节存入累加器A |
DIV AB | (A) ÷ (B) →(A) 和(B) 累加器A 中的数据除以寄存器B 中的数据,结果的商存入累加器A,余数存入寄存器B 中 |
INC A | 累加器A 中的数据加1,结果存在A 中 |
INC direct | (direct) +1→(direct) 直接地址单元中的数据加1,结果送回原地址单元中,如果直接地址是I/O ,其功能是先读入I/O 锁存器的内容,然后在CPU进行加1 操作,再输出到I/O 上,这就是“读—修改—写”操作 |
INC @Ri | ((Ri)) +1→((Ri)) 寄存器的数据指向的地址单元中的数据加1,结果送回原地址单元中 |
NC Rn | (Rn) +1→(Rn) 寄存器Rn 的数据加1,结果送回原地址单元 |
INC DPTR | (DPTR) +1→(DPTR) 数据指针的数据加1,结果送回数据指针中 |
DEC A | (A)- 1→(A) 累加器A 中的数据减1,结果送回累加器A |
DEC direct | (direct)- 1→(direct) 直接地址单元中的数据减1 ,结果送回直接地址单元中 |
DEC @Ri | ((Ri))- 1→((Ri)) 寄存器Ri 指向的地址单元中的数据减1,结果送回原地址单元中 |
DEC Rn | (Rn)- 1→(Rn) 寄存器Rn 中的数据减1,结果送回寄存器Rn 中 |
DA A | 累加器A中的数据做BCD调整 |
RL A | 累加器A中的数据左移一位 |
RR A | 累加器A中的数据右移一位 |
RLC A | 累加器A中的数据连同进位标志位CY左移一位 |
RRC A | 累加器A中的数据连同进位CY 位CY右移一位 |
SWAP A | 累加器中的数据高低半字节互换 |
CPL A | 累加器中的数据按位取反 |
CLR A | 累加器中的数据清0 |
ANL A,direct | 累加器A 中的数据和直接地址单元中的数据执行与操作。结果存在寄存器A中 |
ANL direct,#data | 直接地址单元中的数据和立即数执行与操作。结果存在直接地址单元中 |
NL A,#data | 累加器A的数据和立即数执行与操作。结果存在累加器A中 |
NL A,Rn | 累加器A的数据和寄存器Rn中的数据执行与操作。结果存在累加器A中 |
ANL direct,A | 直接地址单元中的数据和累加器A 的数据执行与操作。结果存在直接地址单元中 |
ANL A,@Ri | 累加器A的数据和工作寄存器Ri指向的地址单元中的数据执行与操作。结果存在累加器A中 |
ORL A,direct | 累加器A中的数据和直接地址单元中的数据执行逻辑或操作。结果存在寄存器A中 |
ORL direct,#data | 累加器A中的数据和直接地址单元中的数据执行逻辑或操作。结果存在寄存器A中 |
ORL A,#data | 累加器A 的数据和立即数执行逻辑或操作。结果存在累加器 |
ORL A,Rn | 累加器A 的数据和寄存器Rn 中的数据执行逻辑或操作。结果存在累加器A 中 |
ORL direct,A | 直接地址单元中的数据和累加器A 的数据执行逻辑或操作。结果存在直接地址单元中 |
ORL A,@Ri | 累加器A 的数据和工作寄存器Ri 指向的地址单元中的数据执行逻辑或操作。结果存在累加器A 中 |
XRL A,direct | 累加器A 中的数据和直接地址单元中的数据执行逻辑异或操作。结果存在寄存器A 中 |
XRL direct,#data | 直接地址单元中的数据和立即数执行逻辑异或操作。结果存在直接地址单元中 |
XRL A,#data | 累加器A 的数据和立即数执行逻辑异或操作。结果存在累加器A中 |
XRL A,Rn | 累加器A 的数据和寄存器Rn 中的数据执行逻辑异或操作。结果存在累加器A 中 |
XRL data,A | 直接地址单元中的数据和累加器A 的数据执行逻辑异或操作。结果存在直接地址单元中 |
XRL A,@Ri | 累加器A 的数据和工作寄存器Ri 指向的地址单元中的数据执行逻辑异或操作。结果存在累加器A 中 |
CLR C | 清除进位标志CY 为0 |
CLR bit | 清除bit 为0 |
SETB C | 设定进位标志CY 为1 |
SETB | bit 设定bit 为1 |
CPL C | 将进位标志CY 反相 |
CPL bit | 将bit 反相 |
ANL C,bit | 将进位标志CY AND bit 值进位标志位CY |
ANL C ,/bit | 将进位标志CY AND bit 反相值进位标志位CY |
ANL A ,#data | 将累加器A 的各位与立即数的相对位置做AND累加器 |
ORL C ,bit | 将进位标志CY OR bit 值进位标志位CY |
ORL C , /bit | 将进位标志CY OR bit 反相值进位标志位CY |
ORL A ,#data | 将累加器A 的各位与立即数的相对位置做OR累加器 |
MOV C,bit | 将bit 值进位标志位CY |
MOV bit ,C | 将进位标志位CY →bit 值 |
JC rel | 当进位标志位CY=1 就跳至rel ,否则执行下一条指令 |
JNC rel | 当进位标志位CY=0 就跳至rel ,否则执行下一条指令 |
JB bit rel | 当进bit=1 就跳至rel ,否则执行下一条指令 |
JNB bit rel | 当进bit=0 就跳至rel ,否则执行下一条指令 |
JBC bit rel | 当进bit=1 跳至rel ,并且清除此bit 为0 ,否则执行下一条指令 |
ACALL addr11 | 2K 范围内子程序调用 |
LCALL addr16 | 64K 范围内子程序调用 |
RET | 子程序返回 |
RET1 | 中断服务程序结束返回 |
AJMP addr11 | 2K 范围内无条件跳转 |
LCALL addr16 | 64K 范围内子程序调用 |
RET | 子程序返回 |
AJMP addr11 | 2K 范围内无条件跳转 |
LJMP addr16 | 64K 范围内无条件跳转 |
SJMP rel | 在此指令的前128 或后128 范围内无条件跳转 |
JMP @A+DPTR | 跳至@A+DPTR所指定的地址 |
JZ rel | 如A 的内容为0,则短跳转,负责执行下一条指令 |
JNZ rel | 如A 的内容不为0,则短跳转,负责执行下一条指令 |
CJNE A , direct ,rel | 如A 的内容与直接地址内的数据不同,则短跳转 |
CJNE A , #data ,rel | 如A 的内容与立即数不同,则短跳转 |
CJNE Rn , #data ,rel | 如Rn 寄存器中的数据与立即数不同,则短跳转 |
CJNE @Ri,#data ,rel | 如间接地址的数据与立即数不同,则短跳转 |
DJNZ Rn ,rel | Rn 寄存器中的数据减1 ,若不为0,则短跳转, 否则执行下条指令 |
DJNZ direct,rel | 直接地址中的数据减1,若不为0,则短跳转,负责执行下条指令 |
NOP | CPU仅仅作取指令,不动作 |