名 称 | 说 明 |
Rn | n=0~7,R0~R7寄存器 |
Direct | 直接地址,内部数据区的地址RAM(00H~7FH) |
SFR | (80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 |
@Ri | 间接寻址Ri=R0、R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) |
#data | 8位常数 |
#data16 | 16位常数 |
Addr16 | 16位的目标地址 |
Addr11 | 11位的目标地址 |
Rel | 相关地址 |
bit | 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位 |
二、常用指令
2.1、算数运算指令
序号 | 指 令 | 字 节 | 周 期 | 说 明 |
1 | ADD A, Rn | 1 | 1 | 将累加器与寄存器的内容相加,结果存回累加器 |
2 | ADD A, direct | 2 | 1 | 将累加器与直接地址的内容相加,结果存回累加器 |
3 | ADD A, @Ri | 1 | 1 | 将累加器与间接地址的内容相加,结果存回累加器 |
4 | ADD A, #data | 2 | 1 | 将累加器与常数相加,结果存回累加器 |
5 | ADDC A, Rn | 1 | 1 | 将累加器与寄存器的内容及进位C相加,结果存回累加器 |
6 | ADDC A, direct | 2 | 1 | 将累加器与直接地址的内容及进位C相加,结果存回累加器 |
7 | ADDC A, @Ri | 1 | 1 | 将累加器与间接地址的内容及进位C相加,结果存回累加器 |
8 | ADDC A, #data | 2 | 1 | 将累加器与常数及进位C相加,结果存回累加器 |
9 | SUBB A, Rn | 1 | 1 | 将累加器的值减去寄存器的值减借位C,结果存回累加器 |
10 | SUBB A, direct | 2 | 1 | 将累加器的值减直接地址的值减借位C,结果存回累加器 |
11 | SUBB A, @Ri | 1 | 1 | 将累加器的值减间接地址的值减借位C,结果存回累加器 |
12 | SUBB A, #data | 2 | 1 | 将累加器的值减常数值减借位C,结果存回累加器 |
13 | INC A | 1 | 1 | 将累加器的值加1 |
14 | INC Rn | 1 | 1 | 将寄存器的值加l |
15 | INC direct | 2 | 1 | 将直接地址的内容加1 |
16 | INC @Ri | 1 | 1 | 将间接地址的内容加1 |
17 | INC DPTR | 1 | 1 | 数据指针寄存器值加1,当DPL溢出时,会使DPH加1,不影响任何标志位 |
18 | DEC A | 1 | 1 | 将累加器的值减1 |
19 | DEC Rn | 1 | 1 | 将寄存器的值减1 |
20 | DEC direct | 2 | 1 | 将直接地址的内容减1 |
21 | DEC @Ri | 1 | 1 | 将间接地址的内容减1 |
22 | MUL AB | 1 | 4 | 将A与B的值相乘,积的低字节存回A,高字节存回B,如果溢出,标志位OV=1 |
23 | DIV AB | 1 | 4 | 将A的值除以B的值,商存回累加器,余数存回B寄存器,C=0,OV=0 |
24 | DA A | 1 | 1 | 将累加器A作十进制调整,若低4位>9或(AC)=1,则低4位值加6;若高4位>9或(C)=1,则高4位值加6; |
2.2、逻辑运算指令
序号 | 指 令 | 字 节 | 周 期 | 说 明 |
25 | ANL A, Rn | 1 | 1 | 将累加器的值与寄存器的值做“与”的逻辑判断,结果存回累加器 |
26 | ANL A, direct | 2 | 1 | 将累加器的值与直接地址的内容做“与”的逻辑判断,结果存回累加器 |
27 | ANL A, @Ri | 1 | 1 | 将累加器的值与间接地址的内容做“与”的逻辑判断,结果存回累加器 |
28 | ANL A, #data | 2 | 1 | 将累加器的值与常数做“与”的逻辑判断,结果存回累加器 |
29 | ANL direct, A | 2 | 1 | 将直接地址的内容与累加器的值做“与”的逻辑判断,结果存回该直接地址 |
30 | ANL direct, #data | 3 | 2 | 将直接地址的内容与常数值做“与”的逻辑判断,结果存回该直接地址 |
31 | ORL A, Rn | 1 | 1 | 将累加器的值与寄存器的值做“或”的逻辑判断,结果存回累加器 |
32 | ORL A, direct | 2 | 1 | 将累加器的值与直接地址的内容做“或”的逻辑判断,结果存回累加器 |
33 | ORL A, @Ri | 1 | 1 | 将累加器的值与间接地址的内容做“或”的逻辑判断,结果存回累加器 |
34 | ORL A, #data | 2 | 1 | 将累加器的值与常数做“或”的逻辑判断,结果存回累加器 |
35 | ORL direct, A | 2 | 1 | 将直接地址的内容与累加器的值做“或”的逻辑判断,结果存回该直接地址 |
36 | ORL direct, #data | 3 | 2 | 将直接地址的内容与常数值做“或”的逻辑判断,结果存回该直接地址 |
37 | XRL A, Rn | 1 | 1 | 将累加器的值与寄存器的值做“异或”的逻辑判断,结果存回累加器 |
38 | XRL A, direct | 2 | 1 | 将累加器的值与直接地址的内容做“异或”的逻辑判断,结果存回累加器 |
39 | XRL A, @Ri | 1 | 1 | 将累加器的值与间接地扯的内容做“异或”的逻辑判断,结果存回累加器 |
40 | XRL A, #data | 2 | 1 | 将累加器的值与常数作“异或”的逻辑判断,结果存回累加器 |
41 | XRL direct, A | 2 | 1 | 将直接地址的内容与累加器的值做“异或”的逻辑判断,结果存回该直接地址 |
42 | XRL direct, #data | 3 | 2 | 将直接地址的内容与常数的值做“异或”的逻辑判断,结果存回该直接地址 |
43 | CLR A | 1 | 1 | 清除累加器的值为0 |
44 | CPL A | 1 | 1 | 将累加器的值反相 |
45 | RL A | 1 | 1 | 将累加器的值左移一位 |
46 | RLC A | 1 | 1 | 将累加器含进位C左移一位 |
47 | RR A | 1 | 1 | 将累加器的值右移一位 |
48 | RRC A | 1 | 1 | 将累加器含进位C右移一位 |
49 | SWAP A | 1 | 1 | 将累加器的高4位与低4位的内容交换 |
2.3、数据转移指令
序号 | 指 令 | 字 节 | 周 期 | 说 明 |
50 | MOV A,Rn | 1 | 1 | 将寄存器的内容载入累加器 |
51 | MOV A,direct | 2 | 1 | 将直接地址的内容载入累加器 |
52 | MOV A,@Ri | 1 | 1 | 将间接地址的内容载入累加器 |
53 | MOV A,#data | 2 | 1 | 将常数载入累加器 |
54 | MOV Rn,A | 1 | 1 | 将累加器的内容载入寄存器 |
55 | MOV Rn,direct | 2 | 2 | 将直接地址的内容载入寄存器 |
56 | MOV Rn,#data | 2 | 1 | 将常数载入寄存器 |
57 | MOV direct,A | 2 | 1 | 将累加器的内容存入直接地址 |
58 | MOV direct,Rn | 2 | 2 | 将寄存器的内容存入直接地址 |
59 | MOV direct1, direct2 | 3 | 2 | 将直接地址2的内容存入直接地址1 |
60 | MOV direct,@Ri | 2 | 2 | 将间接地址的内容存入直接地址 |
61 | MOV direct,#data | 3 | 2 | 将常数存入直接地址 |
62 | MOV @Ri,A | 1 | 1 | 将累加器的内容存入某间接地址 |
63 | MOV @Ri,direct | 2 | 2 | 将直接地址的内容存入某间接地址 |
64 | MOV @Ri,#data | 2 | 1 | 将常数存入某间接地址 |
65 | MOV DPTR,#data16 | 3 | 2 | 将16位的常数存入数据指针寄存器 |
66 | MOVC A,@A+DPTR | 1 | 2 | A的值加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器 |
67 | MOVC A,@A+PC | 1 | 2 | 累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器 |
68 | MOVX A,@Ri | 1 | 2 | 将间接地址所指定外部存储器的内容读入累加器(8位地址) |
69 | MOVX A,@DPTR | 1 | 2 | 将数据指针所指定外部存储器的内容读入累加器(16位地址) |
70 | MOVX @Ri,A | 1 | 2 | 将累加器的内容写入间接地址所指定的外部存储器(8位地址) |
71 | MOVX @DPTR,A | 1 | 2 | 将累加器的内容写入数据指针所指定的外部存储器(16位地址) |
72 | PUSH direct | 2 | 2 | 将直接地址的内容压入堆栈区 |
73 | POP direct | 2 | 2 | 从堆栈弹出该直接地址的内容 |
74 | XCH A,Rn | 1 | 1 | 将累加器的内容与寄存器的内容互换 |
75 | XCH A,direct | 2 | 1 | 将累加器的值与直接地址的内容互换 |
76 | XCH A,@Ri | 1 | 1 | 将累加器的值与间接地址的内容互换 |
77 | XCHD A,@Ri | 1 | 1 | 将累加器的低4位与间接地址的低4位互换 |
2.4、布尔运算指令
序号 | 指 令 | 字 节 | 周 期 | 说 明 |
78 | CLR C | 1 | 1 | 清除进位C为0 |
79 | CLR bit | 2 | 1 | 清除直接地址的某位为0 |
80 | SETB C | 1 | 1 | 设定进位C为1 |
81 | SETB bit | 2 | 1 | 设定直接地址的某位为1 |
82 | CPL C | 1 | 1 | 将进位C的值反相 |
83 | CPL bit | 2 | 1 | 将直接地址的某位值反相 |
84 | ANL C,bit | 2 | 2 | 将进位C与直接地址的某位做“与”的逻辑判断,结果存回进位C |
85 | ANL C,/bit | 2 | 2 | 将进位C与直接地址的某位的反相值做“与”的逻辑判断,结果存回进位C |
86 | ORL C,bit | 2 | 2 | 将进位C与直接地址的某位做“或”的逻辑判断,结果存回进位C |
87 | ORL C,/bit | 2 | 2 | 将进位C与直接地址的某位的反相值做“或”的逻辑判断,结果存回进位C |
88 | MOV C,bit | 2 | 1 | 将直接地址的某位值存入进位C |
89 | MOV bit,C | 2 | 2 | 将进位C的值存入直接地址的某位 |
90 | JC rel | 2 | 2 | 若进位C=1则跳至rel的相关地址 |
91 | JNC rel | 2 | 2 | 若进位C=0则跳至rel的相关地址 |
92 | JB bit,rel | 3 | 2 | 若直接地址的某位为1,则跳至rel的相关地址 |
92 | JNB bit,rel | 3 | 2 | 若直接地址的某位为0,则跳至rel的相关地址 |
94 | JBC bit,rel | 3 | 2 | 若直接地址的某位为1,则跳至rel的相关地址,并将该位值清除为0 |
2.5、程序转移指令
序号 | 指 令 | 字 节 | 周 期 | 说 明 |
95 | ACALL addr11 | 2 | 2 | 调用2 K程序存储器范围内的子程序 |
96 | LCALL addr16 | 3 | 2 | 调用64K程序存储器范围内的子程序 |
97 | RET | 1 | 2 | 从子程序返回 |
98 | RETI | 1 | 2 | 从中断子程序返回 |
99 | AJMP addr11 | 2 | 2 | 绝对跳转(2K内) |
100 | LJMP addr16 | 3 | 2 | 长跳转(64K内) |
101 | SJMP rel | 2 | 2 | 短跳转(2K内)-128~+127字节 |
102 | JMP @A+DPTR | 1 | 2 | 跳至累加器的内容加数据指针所指的相关地址 |
103 | JZ rel | 2 | 2 | 累加器的内容为0,则跳至rel所指相关地址 |
104 | JNZ rel | 2 | 2 | 累加器的内容不为0,则跳至rel所指相关地址 |
105 | CJNE A,direct,rel | 3 | 2 | 将累加器的内容与直接地址的内容比较,不相等则跳至rel所指的相关地址 |
106 | CJNE A,#data,rel | 3 | 2 | 将累加器的内容与常数比较,若不相等则跳至rel所指的相关地址 |
107 | CJNE @Rn,#data,rel | 3 | 2 | 将寄存器的内容与常数比较,若不相等则跳至rel所指的相关地址 |
108 | CJNE @Ri,#data,rel | 3 | 2 | 将间接地址的内容与常数比较,若不相等则跳至rel所指的相关地址 |
109 | DJNZ Rn,rel | 2 | 2 | 将寄存器的内容减1,不等于0则跳至rel所指的相关地址 |
110 | DJNZ direct,rel | 3 | 2 | 将直接地址的内容减1,不等于0则跳至rel所指的相关地址 |
111 | NOP | 1 | 1 | 无动作 |