指令的分类
51系列单片机共111条指令,常见的分类方式有以下几种。
按寻址方式分为以下7种:
-
立即寻址。 -
直接寻址。 -
寄存器寻址。 -
寄存器间接寻址。 -
相对寻址。 -
变址寻址。 -
位寻址。
按功能分为以下4种:
- 数据传送指令。
- 算术、逻辑运算指令。
- 控制转移类指令。
- 位操作指令(布尔指令)。
按字节分类:
指令中常用符号的说明
符号 | 含义 |
---|
Rn | 当前寄存器区的8个工作寄存器R0~R7(n=0-7) | Ri | 可作地址寄存器的2个工作寄存器R0和R1 | direct | 内部数据存储单元的地址及特殊功能寄存器的地址 | #data | 表示8位立即数 | #data16 | 表示16位立即数 | add16 | 表示16位地址 | addrll | 表示11位地址 | rel | 8位带符号的地址偏移量 | bit | 表示位地址 | @ | 间接寻址寄存器或基址寄存器的前缀 | ( ) | 表示括号中单元的内容 | (( )) | 表示间接寻址的内容 |
指令系统
数据传送指令
MOV类指令及功能
功能:从源操作数到目的操作数的数据传送。
指令 | 功能 |
---|
MOV A,Rn | 将寄存器Rn中的内容送到累加器A | MOV A,direct | 直接地址中内容送累加器A | MOV A,@Ri | Ri中的间址内容送累加器A | MOV A,#data | 将立即数送到累加器A | MOV Rn, | 累加器A中的内容送到寄存器Rn | MOV Rn,direct | 直接地址中的内容送Rn | MOV Rn,#data | 立即数送Rn | MOV direct,A | 累加器A的内容送入直接地址中 | MOV direct,Rn | 寄存器R内容送入直接地址中 | MOV direct,direct | 源操作数直接地址的内容送入目的操作数的直接地址中 | MOV direct,@Ri | Ri间址内容送入直接地址中 | MOV direct,#data | 立即数送入直接地址中 | MOV @Ri,A | A中内容送入Ri间址单元中 | MOV @Ri,direct | 直接地址中内容送入Ri间址单元中 | MOV @Ri,#data | 立即数送入Ri间址单元中 | MOV DPTR,direct16 | 16位立即数送入数据指针DPTR中,高8位送入DPH,第8位送入DPL中 |
MOVC类指令及功能
功能: 这两条指令属于查表指令,可以查找放在程序存储器中的数据表格的内容。
指令 | 功能 |
---|
MOVC A,@A+PC | PC+1→PC,(A+PC)→A | MOVC A,@A+DPTR | (A+DPTR)→A |
MOVX类指令及其功能
功能:用来与外部数据存储器区传送数据。
指令 | 功能 |
---|
MOVX A,@DPTR | DPTR间址单元内容送入累加器A | MOVX @DPTR,A | 累加器A中的内容诵读DPTR间址单元 | MOVX A,@Ri | Ri间址单元内容送A | MOVX @Ri,A | A中内容送Ri间址单元 |
交换指令机器功能
指令 | 功能 |
---|
XCH A,Rn? | Rn与A内容交换 | XCH A,direct | 直接地址内容与A内容交换 | XCH A,@Ri | Ri间址内容与A内容交换 | XCHD A,@Ri | Ri间址内容低4位与A中低四位内容交换 | SWAP A | A中高4位与低4位内容交换 |
堆栈操作指令及其功能
指令 | 功能 |
---|
PUSH direct | 栈顶指针SP+1,然后将直接地址中的内容压入栈 | POP direct | 将堆栈栈顶内容弹出堆栈,栈顶指针SP-1 |
算术运算指令
ADD类指令
不带进位的加法运算指令。
指令 | 功能 |
---|
ADD A,Rn | A与Rn中内容相加后再送到A | ADD A,direct | A与直接地址中内容相加后再送到A | ADD A,@Ri | A与Ri间址内容相加后再送到A | ADD A,#data | A与立即数相加后再送到A |
ADDC类指令
带进位的加法运算指令。
指令 | 功能 |
---|
ADDC A,Rn | A与Rn中内容在进位状态相加后再送到A | ADDC A,direct | A与直接地址中内容在进位状态相加后再送到A | ADDC A,@Ri | A与Ri间址内容在进位状态相加后再送到A | ADD A,#data | A与立即数在进位状态相加后再送到A |
SUBB类指令
指令 | 功能 |
---|
SUBB A,Rn | A减Rn内容和进位标志 | SUBB A,direct | A减直接地址内容和进位标志 | SUBB A,@Ri | A减Ri间址单元内容和进位标志 | AUBB A,#data | A减立即数和进位标志 |
MUL和DIV指令
MUL(乘法)、DIV(除法)
指令 | 功能 |
---|
MUL AB | A与B相乘,高八位存入B,第八位存入A | DIV AB | A与B相除,商存入A,余数存入B |
INC指令和DEC指令
INC(加1)
指令 | 功能 |
---|
INC A | A+1 | INC Rn | Rn中内容加1 | INC direct | 直接地址中内容加1 | INC @Ri | Ri间址中内容加1 | INC DPTR | 数据指针加1 |
DEC(减1)
指令 | 功能 |
---|
DEC A | A-1 | DEC Rn | Rn中内容减1 | DEC direct | 直接地址中内容减1 | DEC @Ri | Ri间址单元中的内容减1 |
十进制加法调整指令
功能:将二进制码调整成BCD码
逻辑运算指令
ANL类指令
功能:将源操作数的内容和目的操作数的内容按位“与”,结果存入目的操作数指定单元。
指令 | 功能 |
---|
ANL A,Rn | A和Rn中内容相与后的结果存入A | ANL A,direct | A和直接地址中内容相与后的结果存入A | ANL A,@Ri | A和Ri间址内容相与后的结果存入A | ANL A,#data | A和立即数相与后的结果存入A | ANL direct,A | A和直接地址中内容相与后的结果存入直接地址 | ANL direct,#data | 直接地址内容和立即数相与后的结果存入直接地址 |
ORL类指令
功能:将源操作数内容和目的操作数内容按位“或”,结果存入目的操作数指定单元中。
指令 | 功能 |
---|
ORL A,Rn | A和Rn中内容相或后的结果存入A | ORL A,direct | A和直接地址中内容相或后的结果存入A | ORL A,@Ri | A和Ri间址内容相或后的结果存入A | ORL A,#data | A和立即数相或后的结果存入A | ORL direct,A | A和直接地址中内容相或后的结果存入直接地址 | OPL direct,#data | 直接地址内容和立即数相或后的结果存入直接地址 |
XRL类指令
功能:将两个操作数指定内容按位“异或”,结果存入目的操作数指定单元中。
指令 | 功能 |
---|
XRL A,Rn | A和Rn中内容按位异或后的结果存入A | XRL A,direct | A和直接地址中内容按位异或后的结果存入A | XRL A,@Ri | A和Ri间址内容按位异或后的结果存入A | XRL A,#data | A和立即数按位异或后的结果存入A | XRL direct,A | A和直接地址中内容按位异或后的结果存入直接地址 | XPL direct,#data | 直接地址内容和立即数按位异或后的结果存入直接地址 |
循环移位指令
功能:将累加器A中的内容循环位移或者和进位位一起移位。
指令 | 功能 |
---|
RL A | A中内容循环左移,执行该指令一次左移一位 | RR A | A中内容循环右移,执行该指令一次右移一位 | RLC A | A与进位位CY内容一起循环左移一位 | RRC A | A与进位位CY内容一起循环右移一位 |
取反、清0指令
指令 | 功能 |
---|
CPL A | 累加器A内容按位取反 | CLR A | 累加器A清0 |
控制转移类指令
无条件转移指令
指令 | 功能 |
---|
LJMP add16 | 无条件跳转到add16地址,可在64KB范围内转移,称为长转移指令 | AJMP add11 | 无条件转向add11地址,在2KB范围内转移 | SJMP rel | 相对转移,rel是偏移量,8位有符号数,跳转范围-128~127 | JMP @A+DPTR | 散转指令,无条件转向A与DPTR内容相加后形成的新地址 |
条件转移指令
功能:根据某种特定条件转移的指令,条件满足时转移,条件不满足时则按顺序执行下面的指令。
指令 | 功能 |
---|
JZ rel | A=0则转向PC+2+rel→PC;A≠0则顺序执行 | JNC rel | A≠0则转向PC+2+rel→PC;A=0则顺序执行 | CJNE A,direct,rel | A≠(direct),则转向PC+3+rel→PC;当A>(direct),CY=0;当A<(direct),CY=1;当A=(direct),PC+3→PC顺序执行 | CJNE A,#data,rel | A≠data,则转向PC+3+rel→PC;当A>data,CY=0;当A<data,CY=1;当A=data,PC+3→PC顺序执行 | CJNE Rn,#data,rel | Rn≠data,则转向PC+3+rel→PC;当Rn>data,CY=0;当Rn<data,CY=1;当Rn=data,PC+3→PC顺序执行 | CJNE @Ri,#data,rel | (Ri)≠data,则转向PC+3+rel→PC,当(Ri)>data,CY=0,当(Ri)<data,CY=1,当(Ri)=data,PC+3→PC顺序执行 | DJNZ Rn,rel | Rn-1→Rn,Rn≠0转向PC+2+rel→PC;Rn=0,PC+2→PC顺序执行 | DJNZ direct,rel | (direct)≠0转向PC+2+rel→PC;(direct)=0,PC+2→PC顺序执行 |
调用、返回、空操作指令
指令 | 功能 |
---|
LCALL addr16 | 调用入口地址为addr16的子程序,可调用64KB范围内的子程序 | ACALL addr11 | 调用入口地址为addr11的子程序,可调用2KB范围内的子程序 | RET | 放在子程序最后,是程序返回到主程序断点处 | RETI | 中断返回指令,该指令用于中断服务程序,使中断结束后返回主程序断点处 | NOP | 空操作,执行该指令CPU只进行取指令、译码,不进行其他操作 |
位操作指令
位数据传送类指令
指令 | 功能 |
---|
MOV C,bit | 寻址位的状态送入C | MOV bit,C | C的状态送入位地址中 |
位修正指令
C指累加器C即进位标志CY
指令 | 功能 |
---|
CLP C | 累加器清0 | CLP bit | 寻址位清0 | CPL C | 取反 | CPL bit | 寻址位取反 | SETB C | C置1 | SETB bit | 寻址位置1 |
位逻辑运算指令
指令 | 功能 |
---|
ANL C,bit | 寻址位和C“与”,结果存到C | ANL C,/bit | 寻址位的“非”和C“与”,结果存到C | ORL C,bit | 寻址位和C“或”,结果存到C | ORL C,/bit | 寻址位的“非”和C“或”,结果存到C |
位条件转移指令
指令 | 功能 |
---|
JC rel | C=1转向PC+2+ rel→PC;C=0顺序执行PC+2→PC | JNC rel | C=0转向PC+2+rel→PC;C=1顺序执行PC+2→PC | JB bit,rel | (bit)=1转向PC+3+rel→PC;(bit)=0顺序执行PC+3→PC | JNB bit,rel | (bit)=0转向PC+3+rel→PC;(bit)=1顺序执行PC+3→PC | JBC bit,rel | (bit)=1转向PC+3+rel→PC,同时0→(bit);(bit)=0顺序执行PC+3→PC |
|