目录
指令格式
编译语句实例
单片机的寻址方式
立即数(Immediate Constants)寻址方式
直接(Direct Addressing)寻址方式
寄存器(Register Addressing)寻址方式
寄存器间接(Indirect Addressing)寻址方式
变址(Indexed Addressing)寻址方式
位寻址(Bit Addressing)方式
相对(Relative Addressing)寻址方式
指令系统
数据传送指令
通用传送指令
堆栈操作指令
交换指令
访问程序存储器的数据传送指令
访问外部RAM和外部IO的数据传送指令
算数运算指令
加法指令
减法指令
乘法指令
除法指令
逻辑运算指令
累加器A实现的逻辑操作指令
与逻辑运算指令
或逻辑运算指令
异或逻辑运算指令
位操作指令
位数据传送指令
位修正指令
位逻辑运算指令
控制转移指令
无条件转移类指令
条件转移指令
子程序调用及返回指令
空操作指令
伪指令
伪指令的定义
设置起始地址伪指令 ORG
赋值伪指令 EQU
定义字节数据伪指令 DB
定义双字节数据伪指令 DW
位地址赋值伪指令 BIT
汇编结束伪指令END
指令格式
指令由 标号、操作码、操作数、注释 四部分构成,格式如下
[标号]: 操作码 [操作数] ;[操作数]
- 标号:用来替代指令代码的第一个字节所在单元地址,由用户自行定义,字母开头分。
注:一般一段代码需要一个标号用来标记,方便跳转操作。
- 操作码:规定指令所执行的操作
- 操作数:参与操作的数据信息
- 注释:程序注释,增加程序的可读性
编程格式:标号后用(:)隔开,操作码与操作数用空格隔开,注释与指令用(;)隔开
编译语句实例
[标号] [操作码] [操作数] [注释]
MAIN: MOV A, #20H ; 将立即数#20H送入累加器A中
INC A; (A)加一
;注:(A)代表累加器A中的数值;
单片机的寻址方式
立即数(Immediate Constants)寻址方式
举例:MOV A,#20H
功能:将 20H 送给累加器 A
直接(Direct Addressing)寻址方式
举例:MOV A,20H
功能:将 20H地址中的内容 送到累加器A中
寄存器(Register Addressing)寻址方式
举例:MOV R0,#20H MOV A,R0
功能:将 20H 放入R0寄存器中 ,将 R0寄存器中的值 放入累加器A中
注:不支持Rn之间的相互传送
寄存器间接(Indirect Addressing)寻址方式
举例:MOV R0,#20H MOV A,@R0
功能:将 20H 放入R0寄存器中,取 R0中的值作为地址,寻找地址中的内容 送到累加器A中
注:只有 R0,R1,DPTR 才可作为寄存器间接寻址的源操作数,其中 R0,R1负责内部RAM
DPTR负责外部RAM
变址(Indexed Addressing)寻址方式
举例:MOVC A, @A+DPTR
功能:将 DPTR+A中的值 作为地址,寻找地址中的内容 送到累加器A中
位寻址(Bit Addressing)方式
举例:SETB P1.0
功能:将P1并行口中的第一位置一
注: 位寻址方式位51单片机独有的一种寻址方式
相对(Relative Addressing)寻址方式
举例:SJMP 05H
功能:单片机执行的目标地址为 05H+(P)
指令系统
数据传送指令
通用传送指令
格式:MOV 目的操作数,源操作数
;;;以 A 为目的操作数;;;
MOV A, R1 ;
MOV A, 20H;
MOV A, #20H;
MOV A, @RO;
;;;;;;;;;;;;;;;;;;;;;;;
;;;以工作寄存器Rn为目的操作数;;;
MOV R3, A
MOV R3, #20H
MOV R3, 20H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;以地址为目的操作数;;;
MOV 20H,A
MOV 20H,R3
MOV 20H,30H
MOV 20H,@R1
MOV 20H,#20H
;;;;;;;;;;;;;;;;;;;;;;
;;以间接地址为目的操作数;;;
MOV @R0, A
MOV @R0,@20H
MOV @R0.20H
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;十六位数据传送;;;
MOV DPH, #08H
MOV DPL, #26H
MOV DPTR, #0826H
;;;;;;;;;;;;;;;;;;;
堆栈操作指令
入栈指令:PUSH direct 功能:把指定单元的内容压入SP所指单元格中且SP+1
出栈指令 :POP direct 功能:将SP所指单元格中的内容送到指定单元格中且SP-1
注:direct表示内部RAM的单元地址或SFR的地址
;利用入栈出栈,交换 51H和50H单元格中的内容;
PUSH 50H;利用堆栈的先入后出性质实现
PUSH 51H;
POP 50H;
POP 51H;
交换指令
字节交换指令:XCH A, 源操作数
半字节交换指令:XCHD A,源操作数
高低4位交换指令:SWAP A
注:此类指令必须由累加器A参与
;假设 (A)=21H (R6)=30H
XCH A,R6; 交换后结果为 (A)=30H (R6)=21H
;假设 (A)=21H (R6)=30H
XCHD A,R6; 交换后结果为 (A)=20H (R6)=31H
;假设 (A)=21H
SWAP A; 交换后结果为 (A)=12H
注: 寄存器+括号代表寄存器中的数值
访问程序存储器的数据传送指令
功能:从程序存储器某个的单元读取一个字节的常数并传给累加器A
MOVC A,@A+DPTR;[(A)+(DPTR)]传给(A)
MOVC A,@A+PC ;[(A)+(PC)]传给(A)
访问外部RAM和外部IO的数据传送指令
- CPU访问外部RAM和外部IO均采用的MOVX指令
- CPU访问外部RAM和外部IO采用的都是间接寻址方式
- CPU访问外部RAM和外部IO操作数只能是 R0,R1,DPTR,A
;读(输入)指令
MOVX A,@DPTR;[(DPTR)]内容写入(A)
;写(输出)指令
MOVX @DPTR,A;(A)内容写入[(DPTR)]
算数运算指令
加法指令
不带进位的加法指令:ADD A,源操作数 功能:源操作数+(A)再送入A中
带进位的加法指令: ADDC A,源操作数 功能:源操作数+(A)+(CY)再送入A中
加一指令:INC 源操作数 功能:源操作数+1再送回源操作数
十进制加法调整指令:DA A 功能:将A中的值调整为BCD码
注:DA指令必须与ADD指令联合使用,即ADD后紧跟DA指令
减法指令
带借位的减法指令:SUBB A,源操作数 功能:(A) - 源操作数 -(CY)再送入A中
减一指令:DEC 源操作数 功能:源操作数-1再送回源操作数
注:51中没有不带借位的减法指令
乘法指令
格式:MUL AB ; 功能:累加器A与寄存器B相乘,A中放结果低8位,B中放高8位
MOV A,20H
MOV B,21H ;设置两相乘数据
MUL AB ;进行相乘
MOV 22H,A ;取相乘结果的低八位放入22H中
MOV 23H,B ;取相乘结果的高八位放入21H中
除法指令
格式:DIV AB ; 功能:累加器A除以寄存器B,A中放商,B中放余数
MOV A,20H ;
MOV B,21H ;
DIV AB ;累加器A的值 除以 寄存器B的值
MOV 22H,A ;将商放入22H单元格中
逻辑运算指令
累加器A实现的逻辑操作指令
累加器A清零指令:CLR A 功能:把累加器A的内容清零
累加器A取反指令:CPL A 功能:累加器A的内容按位取反,不影响任何标志位
累加器A循环左移指令:RL A 功能:累加器A循环左移一位,最高位移入最低位
累加器A带进位循环左移指令:RLC A 功能:累加器A的最高位移入CY,CY移入最低位
累加器A循环右移指令:RR A 功能:累加器A循环右移一位,最低位移入最高位
累加器A带进位循环右移指令:RRC A 功能:累加器A的最低位移入CY,CY移入最高位
与逻辑运算指令
ANL 目的操作数,源操作数; 功能:源操作数和目的操作数相与将结果放入源操作数
ANL A,#20H ;(A)和20H进行与操作,结果放入A中
ANL 20H,A ;(20H)和(A)进行与操作,结果放入20H单元格中
ANL 20H,#69H;(20H)与69H进行与操作,结果放入20H单元格中
或逻辑运算指令
ORL 目的操作数,源操作数; 功能:源操作数和目的操作数相或将结果放入源操作数
异或逻辑运算指令
XRL 目的操作数,源操作数; 功能:源操作数和目的操作数异或将结果放入源操作数
位操作指令
位数据传送指令
- 位传送指令仅支持1个指定的bit与累加器C(CY)之间进行状态传送
- 两个位之间不能直接进行状态传送,必须通过C作为介质来进行
;;;完成P1.3与P3.3之间的位互换;;;
MOV C,P1.3;将P1.3位传给C累加器
MOV P3.3,C;将C累加器中的值传给P3.3
位修正指令
位清零:CLR bit
置位: SETB bit
位取反: CPL bit
位逻辑运算指令
位逻辑与运算:ANL C,bit 功能:C与指定位bit相与,结果送入C中
位逻辑或运算:ORL C,bit 功能:C与指定位bit相或,结果送入C中
注:位逻辑运算只能用累加器C(CY)作为目的操作数
控制转移指令
无条件转移类指令
转移指令: AJMP addr11(LABEL) 转移范围:上下2KB
长转移指令:LJMP addr16(LABEL) 转移范围:上下64KB
短转移指令:SJMP addr8(LABEL) 转移范围:上方最远128B,下方最远127B
间接转移指令:JMP @A+DPTR
注:LABEL代表标号
条件转移指令
指令:JZ rel(LABEL) 功能:累加器A的内容为0转移到目标地址,不为0顺序执行
指令:JNZ rel(LABEL) 功能:累加器A的内容为1转移到目标地址,为0顺序执行
指令:JC rel(LABEL) 功能:累加器C的内容为1转移到目标地址,为0顺序执行指令:JNC rel(LABEL) 功能:累加器C的内容为0转移到目标地址,为1顺序执行
指令:JB bit,rel(LABEL) 功能:bit的内容为1转移到目标地址,为0顺序执行
指令:JNB bit,rel(LABEL) 功能:bit的内容为0转移到目标地址,为1顺序执行
指令:JBC bit,rel(LABEL) 功能:bit的内容为1转移到目标地址并且bit置0,为0顺序执行
指令:CJNE A,direct,rel(LABEL)
指令:CJNE A,#data,rel(LABEL)
指令:CJNE Rn,#data,rel(LABEL)
指令:CJNE @Ri,#data,rel(LABEL)
功能:两数进行比较,目的操作数大于源操作数跳转并且CY置0,目的操作数小于源操作数跳转并且CY置1,两数相等则顺序执行
指令:DJNZ Rn ,rel(LABEL)
指令:DJNZ direct ,rel(LABEL)
功能:目的操作数自减1,结果不为0跳转,结果为0顺序执行
注:rel代表偏移量,最大偏移为-128~127,LABEL代表标号
子程序调用及返回指令
长调用指令:LCALL addr16 指令转移范围:64KB,整个ROM空间
短调用指令:ACALL addr11 指令转移范围:2KB
子程序返回指令:RET 功能:子程序最后一条指令RET,子程序结束标志
中断返回指令:RETI 功能:中断程序最后一条指令RETI,中断程序结束标志
空操作指令
NOP 此指令执行时间为1个机器周期
功能:常用来产生一个机器周期时间的延迟
伪指令
伪指令的定义
- 伪指令是汇编语言中起解释说明的命令,不是单片机的指令。
- 伪指令向编译系统说明程序在程序存储器的哪个区域,到何处结束等
设置起始地址伪指令 ORG
ORG xxxxH
功能:设置程序从程序存储器的xxxxH单元开始存放。
注:在汇编语言中ORG可多次定义,但规定的地址由小到大安排,各段地址不允许重叠
ORG 0000H ;当单片机上电时,从0000H开始执行命令,0000H装入了跳转到MAIN的指令
LJMP MAIN ;0000H地址装入此命令
ORG 0030H ;主程序从0030H开始,避免与中断程序发生冲突
MAIN:SETB P1.1;0030H地址中装入此命令
赋值伪指令 EQU
变量代号 EQU 数值
功能:用来给变量代号赋值,这个值可能是单元地址或立即数。
注:在同一个源程序中,任何一个变量代号只能赋值一次
LEN EQU 20;在程序变量中 LEN 代表20
Xdata EQU 4F8BH ;程序中变量Xdata的值为4F8BH
定义字节数据伪指令 DB
[单元地址代号:] DB data
功能:用来说明ROM内容是一个字节的常数data,可定义一个或多个单元为常数
;;;可定义在ORG之后;;;
ORG 1000H
TABLE: DB 30H,63H,0DH
;;;可定义在源程序末尾;;;
;;;将TABLE中第一个数送入R2中;;;
ORG 0030H
MAIN:MOV DPTR, #TABLE;
MOV R2,#00H
MOV A,R2;
MOV A,@A+DPTR;
MOV R2,A;
TABLE: DB 30H,63H,0DH
定义双字节数据伪指令 DW
[单元地址代号:] DW data16
功能:用来说明ROM内容是两个字节的常数data16,使用方法与DB类似
位地址赋值伪指令 BIT
变量代号 BIT 位地址
功能:把位地址赋予指定的变量代号
LED BIT P1.0;用LED替代P1.0位地址
汇编结束伪指令END
END
功能:告知编译系统,源程序到此结束。
注:一个程序中,只允许出现一条END伪指令且必须安排在源程序的结尾