注: Rn与Ri中n=0 ~ 7,i=0 ~ 1,另外Cy是进位位,同时也是状态位,标志位
数据传送类指令
内部数据传送指令
| 助记符 | 作用 | 寻址方式 | 机器周期 | 字节数 |
|---|---|---|---|---|
| MOV A,Rn | 将Rn的内容传送给A | 寄存器 | 1 | 1 |
| MOV A,direct | direct是一个地址单元,将该地址的内容传送给A,例如:MOV A,50H | 直接 | 1 | 2 |
| MOV A @Ri | Ri中存储了一个地址,将该地址的内容传送给A,例如:MOV A ,@R0 | 寄存器间接 | 1 | 1 |
| MOV A #data | 将data传送到A,例如:MOV A,#00H | 立即数 | 1 | 2 |
| MOV Rn,A | 将A的内容传送到Rn中 | 寄存器 | 1 | 1 |
| MOV Rn,direct | direct是一个地址单元,将该地址的内容传送给Rn,例如:MOV R3,50H | 直接 | 1 | 2 |
| MOV Rn,#data | 将data传送到Rn,例如:MOV R3,#00H | 立即数 | 1 | 2 |
| MOV direct,A | 将A的内容传送到direct这个地址中,例如:MOV 50H,A | 寄存器 | 1 | 2 |
| MOV direct,Rn | 将Rn中的内容传送到direct这个地址中 | 寄存器 | 1 | 2 |
| MOV direct2,direct1 | 将diret1这个地址中的内容传送到direct2这个地址中 | 直接 | 2 | 3 |
| MOV direct,@Ri | Ri中存储的是一个地址,将这个地址的内容传送给direct这个地址中 | 寄存器间接 | 2 | 2 |
| MOV direct,#data | 将data这个数据传送到direct这个地址中 | 立即数 | 2 | 3 |
| MOV @Ri,A | Ri中存储的是一个地址,将A中的内容传送到这个地址中 | 寄存器 | 1 | 1 |
| MOV @Ri,direct | Ri存储的是一个地址,将direct这个地址中的数据传送到Ri存储的地址中 | 直接 | 2 | 2 |
| MOV @Ri,#data | Ri存储的是一个地址,将data传送到这个地址中,例如:MOV @R0,#00H | 立即数 | 1 | 2 |
| MOV DPTR,#data16 | 将一个16位data16数据传送到DPTR数据指针中,高8位送入DPH,低8位送入DPL | 立即数 | 2 | 3 |
外部数据传送指令
| 助记符 | 作用 | 寻址方式 | 机器周期 | 字节数 |
|---|---|---|---|---|
| MOVX A,@DPTR | DPTR中存放了一个地址,将该地址的数据传送到A | 寄存器间接 | 2 | 1 |
| MOVX A,@Ri | Ri中存放了一个地址,将该地址的数据传送到A | 寄存器间接 | 2 | 1 |
| MOVX @DPTR,A | DPTR中存放了一个地址,将A中的内容传送到该地址中 | 寄存器 | 2 | 1 |
| MOVX @Ri,A | Ri中存放了一个地址,将A中的内容传送到这个地址中 | 寄存器 | 2 | 1 |
交换类指令
| 助记符 | 作用 | 寻址方式 | 机器周期 | 字节数 |
|---|---|---|---|---|
| XCH A,Rn | 将Rn中的内容与A中的内容互换 | 寄存器 | 1 | 1 |
| XCH A,direct | 将direct这个地址中的内容与A中的内容互换 | 直接 | 1 | 2 |
| XCH A,@Ri | Ri中存放的是一个地址,将该地址中的内容与A中的内容互换 | 寄存器间接 | 1 | 1 |
| XCHD A,@Ri | Ri中存放了一个地址,将该地址中的数据的低4位与A中数据的低4位相交换,高4位不变 | 寄存器间接 | 1 | 1 |
| SWAP A | 将A中的数据的高4位与低4位相交换 | 寄存器 | 1 | 1 |
查表指令
| 助记符 | 作用 | 寻址方式 | 机器周期 | 字节数 |
|---|---|---|---|---|
| MOVC A,@A+PC | 从PC指令地址开始偏移A个地址后,将该地址中的数据再传送给A | 变址寻址 | 2 | 1 |
| MOVC A,@A+DPTR | 从DPTR地址中偏移A个地址后再将该地址中的内容传送给A | 变址寻址 | 2 | 1 |
堆栈操作指令
| 助记符 | 作用 | 寻址方式 | 机器周期 | 字节数 |
|---|---|---|---|---|
| PUSH direct | 将direct 这个地址存放的数据入栈 | 直接 | 2 | 2 |
| POP diret | 将栈顶数据存放在direct这个地址中 | 直接 | 2 | 2 |
注:在使用堆栈时,先要给SP赋初始值,该值是栈底地址,堆栈遵循先进后出的原则,每入栈一个数据后,SP会自加1,出栈时SP会自减1,另外也可对A,B寄存器进行入栈出栈操作,但是对于A寄存器,在赋值时可写A,但在出栈入栈时要写成ACC
算术运算类指令
普通加法指令
| 助记符 | 作用 |
|---|---|
| ADD A,Rn | 将A中的数据与Rn中的数据相加并将结果存放在A中 |
| ADD A,direct | 将direct这个地址中的数据与A中的数据相加并将结果存放在A |
| ADD A,@Ri | Ri存放了一个地址,将该地址的数据与A中的数据相加并将结果存放在A中 |
| ADD A,#data | 将data与A中的数据相加并将结果存放在A中 |
带进位位加法指令
| 助记符 | 作用 |
|---|---|
| ADDC A,Rn | 将A中的数据,Rn中的数据和进位位Cy相加并将结果存放在A中 |
| ADDC A,direct | 将direct这个地址中的数据,A中的数据和进位位Cy相加并将结果存放在A中 |
| ADDC A,@Ri | Ri存放了一个地址,将该地址的数据,A中的数据和进位位Cy相加并将结果存放在A中 |
| ADDC A,#data | 将data与A中的数据相加并将结果存放在A中 |
注:ADDC加法指令常用于多字节加法运算中,例如16位数,其低8位可由ADD指令相加,相加的结果若大于255将发生进位,即Cy=1,在相加这两个数的高8位时就必须加上这个进位位,故而使用ADDC指令。相加进位位,就比如说 0xff + 0x01,结果是0x0100,由于51单片机寄存器是8位的,那么相加的结果只能将低8位存入寄存器中,结果便是0,但此时发生了进位,进位位Cy=1。
减法指令
| 助记符 | 作用 |
|---|---|
| SUBB A,Rn | 用A中的值减去Rn中的值再减去进位位Cy并将结果存放在A中 |
| SUBB A,direct | 用A中的值减去direct这个地址中的值再减去进位位Cy并将结果存放在A中 |
| SUBB A,@Ri | Ri中存放了一个地址,用A中的值减去这个地址中的值再减去进位位Cy并将结果存放在A中 |
| SUBB A,#data | 用A中的值减去data再减去进位位Cy并将结果存放在A中 |
注:一般在用减法时先将进位位Cy清零 , CLR C
加1指令
| 助记符 | 作用 |
|---|---|
| INC A | A中的值加1并将结果存放在A中 |
| INC Rn | Rn中的值加1并将结果存放在Rn中 |
| INC direct | 将direct这个地址中的值加1并将结果存在direct这个地址中 |
| INC @Ri | Ri中存放了一个地址,将该地址中的数据加1并将结果仍存在这个地址中 |
| INC DPTR | DPTR指针指向的数据加1并存在DPTR中 |
减一指令
| 助记符 | 作用 |
|---|---|
| DEC A | A中的值减1并将结果存放在A中 |
| DEC Rn | Rn中的值减1并将结果存放在Rn中 |
| DEC direct | 将direct这个地址中的数据减1并将结果存放在direct这个地址中 |
| DEC @Ri | Ri中存放了一个地址,将该地址中的数据减1并将结果存放在这个地址中 |
乘除法指令
| 助记符 | 作用 |
|---|---|
| MUL AB | 将A中的值与B中的值相乘,积的高位存在B中,低位存在A中 |
| DIV AB | 用A中的值除以B中的值,商存在A中,余数存在B中 |
逻辑运算类指令
逻辑与指令
| 助记符 | 作用 |
|---|---|
| ANL A,direct | 将A中的值与direct这个地址中的值相与并将结果存在A中 |
| ANL A,Rn | 将A中的值与Rn中的值相与并将结果存在A中 |
| ANL A,@Ri | Ri中存放了一个地址,将该地址中的数据与A中的值相与并将结果存在A中 |
| ANL A,#data | 将A中的值与data相与并将结果存在A中 |
| ANL direct,A | 将direct这个地址中的值与A中的值相与并将结果存在direct这个地址中 |
| ANL direct,#data | 将direct这个地址中的值与data相与并将结果存在direct这个地址中 |
逻辑或指令
| 助记符 | 作用 |
|---|---|
| ORL A,direct | 将A中的值与direct这个地址中的值相或并将结果存在A中 |
| ORL A,Rn | 将A中的值与Rn中的值相或并将结果存在A中 |
| ORL A,@Ri | Ri中存放了一个地址,将该地址中的数据与A中的值相或并将结果存在A中 |
| ORL A,#data | 将A中的值与data相或并将结果存在A中 |
| ORL direct,A | 将direct这个地址中的值与A中的值相或并将结果存在direct这个地址中 |
| ORL direct,#data | 将direct这个地址中的值与data相或并将结果存在direct这个地址中 |
逻辑异或指令
| 助记符 | 作用 |
|---|---|
| XRL A,direct | 将A中的值与direct这个地址中的值相异或并将结果存在A中 |
| XRL A,Rn | 将A中的值与Rn中的值相异或并将结果存在A中 |
| XRL A,@Ri | Ri中存放了一个地址,将该地址中的数据与A中的值相异或并将结果存在A中 |
| XRL A,#data | 将A中的值与data相异或并将结果存在A中 |
| XRL direct,A | 将direct这个地址中的值与A中的值相异或并将结果存在direct这个地址中 |
| XRL direct,#data | 将direct这个地址中的值与data相异或并将结果存在direct这个地址中 |
循环移位指令
| 助记符 | 作用 |
|---|---|
| RL A | 将A中的值按二进制循环左移,即第0位变为第1位,以此类推,第7位变为第0位 |
| RLC A | 带进位循环左移,即进位位Cy变为A中的值的第0位,原第0位变为第1位,以此类推,第7位变为标志位Cy |
| RR A | 将A中的值按二进制循环右移,即第7位变为第6位,以此类推,第0位变为第7位 |
| RRC A | 带进位循环右移,即进位位Cy变为A中的值的第7位,原第7位变为第6位,以此类推,第0位变为标志位Cy |
位操作类指令
注:在单片机中要对某个引脚进行操作,这个引脚就是一个位bit,例如将P1.1引脚置1,可用 SETB P1.1
位传送指令
| 助记符 | 作用 |
|---|---|
| MOV C,bit | 将bit的值传送到标志位Cy中 |
| MOV bit,C | 将标志位Cy的值传送到bit中 |
位置位和位复位指令
| 助记符 | 作用 |
|---|---|
| CLR C | 将标志位Cy清0 |
| CLR bit | 将bit清0 |
| SETB C | 将标志位Cy置1 |
| SETB bit | 将bit置1 |
位运算指令
| 助记符 | 作用 |
|---|---|
| ANL C,bit | 将标志位Cy与bit相与并将结果存到标志位Cy中 |
| ANL C,/bit | 将bit取反和标志位Cy相与并将结果存到标志位Cy中 |
| ORL C,bit | 将标志位Cy与bit相或并将结果存到标志位Cy中 |
| ORL C,/bit | 将bit取反和标志位Cy相或并将结果存到标志位Cy中 |
| CPL C | 将标志位Cy取反 |
| CPL bit | 将bit取反 |
位转移指令
| 助记符 | 作用 |
|---|---|
| JB bit,rel | 如果bit的值位1,则程序跳到当前指令地址+rel这个位置继续执行,否则顺序执行 |
| JNB bit ,rel | 如果bit的值位0,则程序跳到当前指令地址+rel这个位置继续执行 ,否则顺序执行 |
| JBC bit ,erl | 如果bit的值位1,则程序跳到当前指令地址+rel这个位置继续执行并将bit清0,否则顺序执行 |
判断Cy标志指令
| 助记符 | 作用 |
|---|---|
| JC dst | dst表示一个标识符,如果Cy的值为1,程序跳到dst所标识的位置继续执行 ,否则顺序执行 |
| JNC dst | dst表示一个标识符,如果Cy的值不为1,程序跳到dst所标识的位置继续执行 ,否则顺序执行 |
例:
SETB C
JC dst
MOV A, #01H
dst:
MOV A, #02H
END
控制转移类指令
无条件转移指令
| 助记符 | 作用 | 范围 |
|---|---|---|
| LJMP dst | dst表示一个标识符,程序无条件跳转到dst这个位置继续执行 | 任意位置 |
| AJMP dst | dst表示一个标识符,程序无条件跳转到dst这个位置继续执行 | 2KB |
| SJMP dst | dst表示一个标识符,程序无条件跳转到dst这个位置继续执行 | -128~127字节以内 |
| JMP @A+DPTR | 程序无条件跳转到A与DPTR和这个地址位置开始执行 | 64KB |
例:
MOV A, #03H
LJMP dst
MOV A, #01H
dst:
MOV A, #02H
END
条件转移指令
| 助记符 | 作用 | 范围 |
|---|---|---|
| JZ dst | dst是一个标识符,如果A的值为0,程序跳转到dst这个位置开始执行,否则顺序执行 | -128~127字节 |
| JNZ dst | dst是一个标识符,如果A的值不为1,程序跳转到dst这个位置开始执行,否则顺序执行 | -128~127字节 |
| CJNE A,#data,dst | dst是一个标识符,如果A的值与data不相等,程序跳转到dst这个位置开始执行,否则顺序执行 ;如果A的值小于data,Cy=1,否则Cy=0 | -128~127字节 |
| CJNE Rn,#data,dst | dst是一个标识符,如果Rn的值与data不相等,程序跳转到dst这个位置开始执行,否则顺序执行 ;如果A的值小于data,Cy=1,否则Cy=0 | -128~127字节 |
| CJNE @Ri,#data,dst | dst是一个标识符,Ri存放了一个地址,如果这个地址存放的值与data不相等,程序跳转到dst这个位置开始执行,否则顺序执行 ;如果这个地址存放的值小于data,Cy=1,否则Cy=0 | -128~127字节 |
| CJNE A,direct,dst | dst是一个标识符,如果A的值与direct的值不相等,程序跳转到dst这个位置开始执行,否则顺序执行 ;如果A的值小于direct的值,Cy=1,否则Cy=0 | -128~127字节 |
| DJNZ Rn,dst | dst是一个标识符,将Rn的值先减1,如果此时Rn的值不为0,程序跳转到dst这个位置开始执行,否则顺序执行,常用作循环中 | -128~127字节 |
| DJNZ direct,dst | dst是一个标识符,将direct这个地址的值先减1,如果此时direct这个地址的值不为0,程序跳转到dst这个位置开始执行,否则顺序执行 | -128~127字节 |
例:
MOV A, #02H
JZ dst
MOV B, #01H
dst:
MOV B, #02H
END
调用和返回指令
| 助记符 | 作用 | 范围 |
|---|---|---|
| ACALL name | name表示子程序名,该指令表示调用子程序 | 2KB |
| LCALL name | name表示子程序名,该指令表示调用子程序 | 任意位置 |
| RET | 该指令表示调用子程序结束,子程序返回 | |
| RETI | 该指令表示中断结束,中断返回 |
例:
MOV A, #02H
MOV B, #03H
ACALL ADD_AB
MOV R0, A
SJMP $ //程序卡在这个位置ADD_AB:
ADD A, B
RETEND
空操作
| 助记符 | 作用 | 机器周期 |
|---|---|---|
| NOP | 空操作 | 1 |
伪指令
ORG
ORG 1000H
MOV A,#00H
规定程序块或数据块存放的起始地址,示例中表示MOV A,#00H存放在1000H开始的单元中
END
汇编语言源程序结束标志
DB
ORG 1000H
TAB:
DB 02H,'B',"abc"
将指令后的数据依次存放在指定的地址单元中。示例中TAB的地址为1000H,故而从该地址开始的单元依次存放02H,B的ASCII码,a的ASCII码,b的ASCII码,c的ASCII码
DW
ORG 1000H
TAB:
DW 3000H, 80H
该指令后的数据为2个字节,存放数据时类似DB,高位在前,低位在后。示例中TAB的地址为1000H,那么1000H存放30H,1001H存放00H,1002H存放00H,1003H存放80H
DS
ORG 1000H
TAB:
DS 1FH
该指令用于保留存储单元用作备用空间,示例中TAB的地址为1000H,,从1000H开始预留32个存储字节空间(1000H~101FH)
EQU
DLY: EQU 3200H
TAB: EQU DLY
将该指令后的值赋给本语句的标号。示例中:DLY的地址是3200H,并将TAB的地址设置为DLY的地址,即TAB的地址也是3200H
BIT
DLY1: BIT 31H
DIY2: BIT 32H
将位地址赋给本语句的标号,示例中:DLY1和DLY2当作位地址31H和32H。