51单片机

您所在的位置:网站首页 汇编中rel跳转的是自己定义的吗 51单片机

51单片机

2024-06-11 00:01| 来源: 网络整理| 查看: 265

目录

指令格式

编译语句实例 

单片机的寻址方式

立即数(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伪指令且必须安排在源程序的结尾



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3