51单片机汇编指令表–STC宏晶MCU
51单片机汇编指令简介
51系列单片机汇编指令表非常庞大,包含了五大类指令,以下是各类指令的一个简要概述和部分示例:
一、数据传送类指令
这些指令用于在寄存器之间、寄存器与存储单元之间以及立即数与寄存器之间的数据传输。
- MOV:通用数据传送指令 - MOV A,Rn 将工作寄存器Rn的内容传送到累加器A中。
- MOV direct,A 将累加器A的内容传送到直接地址指定的内部RAM单元。
- MOVX A,@Ri (对于访问外部RAM)通过间接寻址将外部RAM中的内容传送到累加器A(其中Ri为R0或R1)。
- MOVX @DPTR,A 向外部RAM以DPTR指向的地址写入累加器A的内容。
 
二、算术操作类指令
包括加法、减法、比较等操作。
- ADD、ADDC:对累加器进行加法运算。
- SUBB:带借位的减法运算。
- INC、DEC:递增或递减指定寄存器或内存单元的值。
三、逻辑运算类指令
涉及逻辑与、或、异或等操作。
- ANL(AND Logical):按位逻辑与操作。
- ORL(OR Logical):按位逻辑或操作。
- XRL(Exclusive OR Logical):按位逻辑异或操作。
四、控制转移类指令
用于程序流程控制,如条件跳转和无条件跳转。
- JMP:无条件跳转到指定地址。
- AJMP、LJMP:短跳转和长跳转到子程序或其他地址。
- JC、JNC、JZ、JNZ 等:根据标志位状态进行条件转移。
五、位操作类指令
处理单个位的操作。
- SETB:设置一个位为1。
- CLR:清零一个位。
- CPL:取反一个位。
- JB(Jump if Bit Set)、JNB(Jump if Bit Not Set):依据某位的状态进行跳转。
 以上只是简单的举例,并未列出所有51单片机的汇编指令。每条指令的具体格式、功能和使用情况可以参考完整的MCS-51汇编语言手册。
宏晶MCU-STC8Hxx
算术运算
| 助记符 | 指令说明 | 字节 | 时钟 | 
|---|---|---|---|
| ADD A,Rn | 寄存器内容加到累加器 | 1 | 1 | 
| ADD A,direct | 直接地址单元的数据加到累加器 | 2 | 1 | 
| ADD A,@Ri | 间接地址单元的数据加到累加器 | 1 | 1 | 
| ADD A,#data | 立即数加到累加器 | 2 | 1 | 
| ADDC A,Rn | 寄存器带进位加到累加器 | 1 | 1 | 
| ADDC A,direct | 直接地址单元的数据带进位加到累加器 | 2 | 1 | 
| ADDC A,@Ri | 间接地址单元的数据带进位加到累加器 | 1 | 1 | 
| ADDC A,#data | 立即数带进位加到累加器 | 2 | 1 | 
| SUBB A,Rn | 累加器带借位减寄存器内容 | 1 | 1 | 
| SUBB A,direct | 累加器带借位减直接地址单元的内容 | 2 | 1 | 
| SUBB A,@Ri | 累加器带借位减间接地址单元的内容 | 1 | 1 | 
| SUBB A,#data | 累加器带借位减立即数 | 2 | 1 | 
| INC A | 累加器加1 | 1 | 1 | 
| INC Rn | 寄存器加1 | 1 | 1 | 
| INC direct | 直接地址单元加1 | 2 | 1 | 
| INC @Ri | 间接地址单元加1 | 1 | 1 | 
| DEC A | 累加器减1 | 1 | 1 | 
| DEC Rn | 寄存器减1 | 1 | 1 | 
| DEC direct | 直接地址单元减1 | 2 | 1 | 
| DEC @Ri | 间接地址单元减1 | 1 | 1 | 
| INC DPTR | 地址寄存器DPTR加1 | 1 | 1 | 
| MUL AB | A乘以B,B存放高字节,A存放低字节 | 1 | 2 | 
| DIV AB | A除以B,B存放余数,A存放商 | 1 | 6 | 
| DA A | 累加器十进制调整 | 1 | 3 | 
逻辑运算
| 助记符 | 指令说明 | 字节 | 时钟 | 
|---|---|---|---|
| ANL A,Rn | 累加器与寄存器相与 | 1 | 1 | 
| ANL A,direct | 累加器与直接地址单元相与 | 2 | 1 | 
| ANL A,@Ri | 累加器与间接地址单元相与 | 1 | 1 | 
| ANL A,#data | 累加器与立即数相与 | 2 | 1 | 
| ANL direct,A | 直接地址单元与累加器相与 | 2 | 1 | 
| ANL direct,#data | 直接地址单元与立即数相与 | 3 | 1 | 
| ORL A,Rn | 累加器与寄存器相或 | 1 | 1 | 
| ORL A,direct | 累加器与直接地址单元相或 | 2 | 1 | 
| ORL A,@Ri | 累加器与间接地址单元相或 | 1 | 1 | 
| ORL A,#data | 累加器与立即数相或 | 2 | 1 | 
| ORL direct,A | 直接地址单元与累加器相或 | 2 | 1 | 
| ORL direct,#data | 直接地址单元与立即数相或 | 3 | 1 | 
| XRL A,Rn | 累加器与寄存器相异或 | 1 | 1 | 
| XRL A,direct | 累加器与直接地址单元相异或 | 2 | 1 | 
| XRL A,@Ri | 累加器与间接地址单元相异或 | 1 | 1 | 
| XRL A,#data | 累加器与立即数相异或 | 2 | 1 | 
| XRL direct,A | 直接地址单元与累加器相异或 | 2 | 1 | 
| XRL direct,#data | 直接地址单元与立即数相异或 | 3 | 1 | 
| CLR A | 累加器清0 | 1 | 1 | 
| CPL A | 累加器取反 | 1 | 1 | 
| RL A | 累加器循环左移 | 1 | 1 | 
| RLC A | 累加器带进位循环左移 | 1 | 1 | 
| RR A | 累加器循环右移 | 1 | 1 | 
| RRC A | 累加器带进位循环右移 | 1 | 1 | 
| SWAP A | 累加器高低半字节交换 | 1 | 1 | 
数据传输
| 助记符 | 指令说明 | 字节 | 时钟 | 
|---|---|---|---|
| MOV C,bit | 直接地址位送入进位位 | 2 | 1 | 
| MOV bit,C | 进位位送入直接地址位 | 2 | 1 | 
| MOV A,Rn | 寄存器内容送入累加器 | 1 | 1 | 
| MOV A,direct | 直接地址单元中的数据送入累加器 | 2 | 1 | 
| MOV A,@Ri | 间接地址中的数据送入累加器 | 1 | 1 | 
| MOV A,#data | 立即数送入累加器 | 2 | 1 | 
| MOV Rn,A | 累加器内容送入寄存器 | 1 | 1 | 
| MOV Rn,direct | 直接地址单元中的数据送入寄存器 | 2 | 1 | 
| MOV Rn,#data | 立即数送入寄存器 | 2 | 1 | 
| MOV direct,A | 累加器内容送入直接地址单元 | 2 | 1 | 
| MOV direct,Rn | 寄存器内容送入直接地址单元 | 2 | 1 | 
| MOV direct,direct | 直接地址单元中的数据送入另一个直接地址单元 | 3 | 1 | 
| MOV direct,@Ri | 间接地址中的数据送入直接地址单元 | 2 | 1 | 
| MOV direct,#data | 立即数送入直接地址单元 | 3 | 1 | 
| MOV @Ri,A | 累加器内容送间接地址单元 | 1 | 1 | 
| MOV @Ri,direct | 直接地址单元数据送入间接地址单元 | 2 | 1 | 
| MOV @Ri,#data | 立即数送入间接地址单元 | 2 | 1 | 
| MOV DPTR,#data16 | 16位立即数送入数据指针 | 3 | 1 | 
| MOVC A,@A+DPTR | 以DPTR为基地址变址寻址单元中的数据送入累加器 | 1 | 4 | 
| MOVC A,@A+PC | 以PC为基地址变址寻址单元中的数据送入累加器 | 1 | 3 | 
| MOVX A,@Ri | 扩展地址(8位地址)的内容送入累加器A中 | 1 | 3[1] | 
| MOVX A,@DPTR | 扩展RAM(16位地址)的内容送入累加器A中 | 1 | 2[1] | 
| MOVX @Ri,A | 将累加器A的内容送入扩展RAM(8位地址)中 | 1 | 3[1] | 
| MOVX @DPTR,A | 将累加器A的内容送入扩展RAM(16位地址)中 | 1 | 2[1] | 
| PUSH direct | 直接地址单元中的数据压入堆栈 | 2 | 1 | 
| POP direct | 栈底数据弹出送入直接地址单元 | 2 | 1 | 
| XCH A,Rn | 寄存器与累加器交换 | 1 | 1 | 
| XCH A,direct | 直接地址单元与累加器交换 | 2 | 1 | 
| XCH A,@Ri | 间接地址与累加器交换 | 1 | 1 | 
| XCHD A,@Ri | 间接地址的低半字节与累加器交换 | 1 | 1 | 
布尔操作
| 助记符 | 指令说明 | 字节 | 时钟 | 
|---|---|---|---|
| CLR C | 清零进位位 | 1 | 1 | 
| CLR bit | 清0直接地址位 | 2 | 1 | 
| SETB C | 置1进位位 | 1 | 1 | 
| SETB bit | 置1直接地址位 | 2 | 1 | 
| CPL C | 进位位求反 | 1 | 1 | 
| CPL bit | 直接地址位求反 | 2 | 1 | 
| ANL C,bit | 进位位和直接地址位相与 | 2 | 1 | 
| ANL C,/bit | 进位位和直接地址位的反码相与 | 2 | 1 | 
| ORL C,bit | 进位位和直接地址位相或 | 2 | 1 | 
| ORL C,/bit | 进位位和直接地址位的反码相或 | 2 | 1 | 
| JC rel | 进位位为1跳转 | 2 | 1/3[2] | 
| JNC rel | 进位位为0跳转 | 2 | 1/3[2] | 
| JB bit,rel | 直接地址位为1则跳转 | 3 | 1/3[2] | 
| JNB bit,rel | 直接地址位为0则跳转 | 3 | 1/3[2] | 
| JBC bit,rel | 直接地址位为1则跳转,该位清0 | 3 | 1/3[2] | 
程序分支
| 助记符 | 指令说明 | 字节 | 时钟 | 
|---|---|---|---|
| ACALL addr11 | 短调用子程序 | 2 | 3 | 
| LCALL addr16 | 长调用子程序 | 3 | 3 | 
| RET | 子程序返回 | 1 | 3 | 
| RETI | 中断返回 | 1 | 3 | 
| AJMP addr11 | 短跳转 | 2 | 3 | 
| LJMP addr16 | 长跳转 | 3 | 3 | 
| SJMP rel | 相对跳转 | 2 | 3 | 
| JMP @A+DPTR | 相对于DPTR的间接跳转 | 1 | 4 | 
| JZ rel | 累加器为零跳转 | 2 | 1/3[2] | 
| JNZ rel | 累加器非零跳转 | 2 | 1/3[2] | 
| CJNE A,direct,rel | 累加器与直接地址单元不相等跳转 | 3 | 2/3[3] | 
| CJNE A,#data,rel | 累加器与立即数不相等跳转 | 3 | 1/3[2] | 
| CJNE Rn,#data,rel | 寄存器与立即数不相等跳转 | 3 | 2/3[3] | 
| CJNE @Ri,#data,rel | 间接地址单元与立即数不相等跳转 | 3 | 2/3[3] | 
| DJNZ Rn,rel | 寄存器减1后非零跳转 | 2 | 2/3[3] | 
| DJNZ direct,rel | 直接地址单元减1后非零跳转 | 3 | 2/3[3] | 
| NOP | 空操作 | 1 | 1 | 
- 1、访问外部扩展 RAM 时,指令的执行周期与寄存器 BUS_SPEED 中的 SPEED[2:0]位有关
- 2、对于条件跳转语句的执行时间会依据条件是否满足而不同。当条件不满足时,不会发生跳转而继续执行下一条指令,此时条件跳转语句的执行时间为 1 个时钟;当条件满足时, 则会发生跳转,此时条件跳转语句的执行时间为 3 个时钟。
- 3、对于条件跳转语句的执行时间会依据条件是否满足而不同。当条件不满足时,不会发生跳转而继续执行下一条指令,此时条件跳转语句的执行时间为 2 个时钟;当条件满足时,则会发生跳转,此条件跳转语句的执行时间为 3 个时钟