指令格式
指令由 标号、操作码、操作数、注释 四部分构成,格式如下
[标号]: 操作码 [操作数] ;[操作数]
标号:用来替代指令代码的第一个字节所在单元地址,由用户自行定义,字母开头分。
注:一般一段代码需要一个标号用来标记,方便跳转操作。
操作码:规定指令所执行的操作
操作数:参与操作的数据信息
注释:程序注释,增加程序的可读性
编程格式:标号后用(:)隔开,操作码与操作数用空格隔开,注释与指令用(;)隔开
编译语句实例
[标号] [操作码] [操作数] [注释]
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
|
|