解决方案

51单片机——汇编指令合集

seo靠我 2023-09-25 16:43:36

目录

指令格式

编译语句实例 

单片机的寻址方式

立即数(Immediate Constants)寻址方式

直接(Direct Addressing)寻址方式 

寄存器(Register Addressing)寻址方SEO靠我

寄存器间接(Indirect Addressing)寻址方式 

变址(Indexed Addressing)寻址方式 

位寻址(Bit Addressing)方式 

相对(Relative AddressingSEO靠我)寻址方式

指令系统 

数据传送指令

通用传送指令

 堆栈操作指令

 交换指令

访问程序存储器的数据传送指令 

访问外部RAM和外部IO的数据传送指令

算数运算指令 

加法指令 

减法指令 

乘法指令 

 除法指令

逻辑运算指令

累加器A实现的逻SEO靠我辑操作指令

与逻辑运算指令 

或逻辑运算指令 

异或逻辑运算指令 

位操作指令

 位数据传送指令

位修正指令 

位逻辑运算指令

控制转移指令 

无条件转移类指令 

条件转移指令 

子程序调用及返回指令 

空操作指令 

伪指令

伪指令的定义

设置起始地SEO靠我址伪指令 ORG

赋值伪指令 EQU 

定义字节数据伪指令 DB 

定义双字节数据伪指令 DW

位地址赋值伪指令 BIT

汇编结束伪指令END 

指令格式

 指令由  标号、操作码、操作数、注释 四部分构成,格式如下

[标号]: SEO靠我操作码 [操作数] ;[操作数]标号:用来替代指令代码的第一个字节所在单元地址,由用户自行定义,字母开头分。

注:一般一段代码需要一个标号用来标记,方便跳转操作。

操作码:规定指令所执行的操作操作数:参与SEO靠我操作的数据信息注释:程序注释,增加程序的可读性

编程格式标号后(:)隔开,操作码与操作数用空格隔开,注释与指令用(;)隔开

编译语句实例 

[标号] [操作码] [操作数] [注释] MASEO靠我IN: MOV A, #20H ; 将立即数#20H送入累加器A中INC A; (A)加一 ;注:(A)代表累加器A中的数值;

单片机的寻址方式

立即数(Immediate ConstanSEO靠我ts)寻址方式

举例:MOV A,#20H 

功能:将 20H 送给累加器 A

直接(Direct Addressing)寻址方式 

举例:MOV A,20H 

功能:将 20H地址中的内容 送到累加器A中

寄存器(RSEO靠我egister Addressing)寻址方式

举例:MOV R0,#20H  MOV  A,R0 

功能:将 20H 放入R0寄存器中 ,将 R0寄存器中的值 放入累加器A中

注:不支持Rn之间的相互传送

SEO靠我存器间接(Indirect Addressing)寻址方式

举例:MOV R0,#20H  MOV A,@R0

功能:将 20H 放入R0寄存器中,取 R0中的值作为地址,寻找地址中的内容 送到累加器A中SEO靠我

注:只有 R0,R1,DPTR 才可作为寄存器间接寻址的源操作数,其中 R0,R1负责内部RAM

        DPTR负责外部RAM

变址(Indexed Addressing)寻址方式 

举例:MOVC  A, @A+SEO靠我DPTR

功能:将 DPTR+A中的值 作为地址,寻找地址中的内容 送到累加器A中

位寻址(Bit Addressing)方式 

举例:SETB P1.0

功能:将P1并行口中的第一位置一

注: 位寻址方式位51SEO靠我单片机独有的一种寻址方式

相对(Relative Addressing)寻址方式 

举例:SJMP 05H

功能:单片机执行的目标地址为 05H+(P)

指令系统 

数据传送指令

通用传送指令

格式:MOV  目的操作SEO靠我数,源操作数

;;;以 A 为目的操作数;;; MOV A, R1 ; MOV A, 20H; MOV A, #20H; MOV A, @SEO靠我RO; ;;;;;;;;;;;;;;;;;;;;;;;;;;以工作寄存器Rn为目的操作数;;; MOV R3, A MOV R3, #20H SEO靠我 MOV R3, 20H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以地址为目的操作数;;; MOV 20H,A MOV 20SEO靠我H,R3 MOV 20H,30H MOV 20H,@R1 MOV 20H,#20H ;;;;;;;;;;;;;;;;;;;;;;;;以间SEO靠我接地址为目的操作数;;; MOV @R0, A MOV @R0,@20H MOV @R0.20H ;;;;;;;;;;;;;;;;;;;SEO靠我;;;;;;;;;十六位数据传送;;; MOV DPH, #08H MOV DPL, #26HMOV DPTR, #0826H ;;;;;;;;;;;;SEO靠我;;;;;;;

 堆栈操作指令

入栈指令:PUSH direct    功能:把指定单元的内容压入SP所指单元格中且SP+1

出栈指令 :POP   direct    功能:将SP所指单元格中的内容送到指定单元格中且SP-SEO靠我1

注:direct表示内部RAM的单元地址或SFR的地址

;利用入栈出栈,交换 51H和50H单元格中的内容; PUSH 50H;利用堆栈的先入后出性质实现 PUSH 5SEO靠我1H; POP 50H; POP 51H;

 交换指令

字节交换指令:XCH  A, 源操作数

半字节交换指令:XCHD A,源操作数

高低4位交换指令:SWAP A

注:此类指令SEO靠我必须由累加器A参与

;假设 (A)=21H (R6)=30H XCH A,R6; 交换后结果为 (A)=30H (R6)=21H;假设 (A)=21H (R6)=30H SEO靠我XCHD A,R6; 交换后结果为 (A)=20H (R6)=31H;假设 (A)=21H SWAP A; 交换后结果为 (A)=12H

注: 寄存器+括号代表寄存器中的数值

访问程序存储SEO靠我器的数据传送指令 

功能:从程序存储器某个的单元读取一个字节的常数并传给累加器A

MOVC A,@A+DPTR;[(A)+(DPTR)]传给(A)MOVC A,@A+PC ;[(A)+(PC)]传给(A)

访SEO靠我问外部RAM和外部IO的数据传送指令

CPU访问外部RAM和外部IO均采用的MOVX指令CPU访问外部RAM和外部IO采用的都是间接寻址方式 CPU访问外部RAM和外部IO操作数只能是 R0,R1,DPSEO靠我TR,A ;读(输入)指令 MOVX A,@DPTR;[(DPTR)]内容写入(A);写(输出)指令 MOVX @DPTR,A;(A)内容写入[(DPSEO靠我TR)]

算数运算指令 

加法指令 

不带进位的加法指令:ADD A,源操作数      功能:源操作数+(A)再送入A中

带进位的加法指令:    ADDC A,源操作数   功能:源操作数+(A)+(CY)再送入A中

加一指令:INC SEO靠我源操作数                            功能:源操作数+1再送回源操作数

十进制加法调整指令:DA A                         功能:将A中的值调整为BCD码

注:DA指令必须与ADD指令联合使用,即ADD后紧跟DA指令

减法指令 

带借位的减法指令:SUBB A,源SEO靠我操作数功能:(A) - 源操作数 -(CY)再送入A中

减一指令:DEC  源操作数                           功能:源操作数-1再送回源操作数

注:51中没有不带借位的减法指令

乘法指令 

 格式:MUL   AB ;            功能:累加器A与寄存SEO靠我器B相乘,A中放结果低8位,B中放高8位

MOV A,20H MOV B,21H ;设置两相乘数据 MUL AB ;进行相乘 MOV 22H,A ;取相乘SEO靠我结果的低八位放入22H中 MOV 23H,B ;取相乘结果的高八位放入21H中

 除法指令

 格式:DIV   AB ;              功能:累加器A除以寄存器B,A中放商,B中放余数

MOV A,20H ; SEO靠我 MOV B,21H ; DIV AB ;累加器A的值 除以 寄存器B的值 MOV 22H,A ;将商放入22H单元格中

逻辑运算指令

累加器A实现的逻辑操作SEO靠我指令

累加器A清零指令:CLR  A       功能:把累加器A的内容清零

累加器A取反指令:CPL  A        功能:累加器A的内容按位取反,不影响任何标志位

累加器A循环左移指令:RL  A   功能:累加器A循环左移一位,最高SEO靠我位移入最低位

累加器A带进位循环左移指令:RLC  A   功能:累加器A的最高位移入CY,CY移入最低位

累加器A循环右移指令:RR  A   功能:累加器A循环右移一位,最低位移入最高位

累加器A带进位循环右移指令SEO靠我RRC  A   功能:累加器A的最低位移入CY,CY移入最高位

与逻辑运算指令 

 ANL  目的操作数,源操作数;     功能:源操作数和目的操作数相与将结果放入源操作数 

ANL A,#20H ;(A)和20H进行与操SEO靠我作,结果放入A中 ANL 20H,A ;(20H)和(A)进行与操作,结果放入20H单元格中 ANL 20H,#69H;(20H)与69H进行与操作,结果放入20H单元SEO靠我格中

或逻辑运算指令 

ORL   目的操作数,源操作数;    功能:源操作数和目的操作数相或将结果放入源操作数 

异或逻辑运算指令 

XRL   目的操作数,源操作数;    功能:源操作数和目的操作数异或将结果放入源操作数 

SEO靠我操作指令

 位数据传送指令

位传送指令仅支持1个指定的bit与累加器C(CY)之间进行状态传送两个位之间不能直接进行状态传送,必须通过C作为介质来进行 ;;;完成P1.3与P3.3之间的位SEO靠我互换;;; MOV C,P1.3;将P1.3位传给C累加器 MOV P3.3,C;将C累加器中的值传给P3.3

位修正指令 

位清零:CLR bit

置位:    SETB  bit

SEO靠我取反: CPL  bit

位逻辑运算指令

位逻辑与运算:ANL C,bit          功能:C与指定位bit相与,结果送入C中

位逻辑或运算:ORL C,bit          功能:C与指定位bit相或,结果送入C中

注:位逻辑运算只能用SEO靠我累加器C(CY)作为目的操作数

控制转移指令 

无条件转移类指令 

转移指令:   AJMP addr11(LABEL)   转移范围:上下2KB

长转移指令:LJMP addr16(LABEL)   转移范围:上下64KB

短转移SEO靠我指令:SJMP addr8(LABEL)     转移范围:上方最远128B,下方最远127B

间接转移指令:JMP @A+DPTR

注:LABEL代表标号 

条件转移指令 

指令:JZ  rel(LABEL)              功能:累加器SEO靠我A的内容为0转移到目标地址,不为0顺序执行

指令:JNZ rel(LABEL)             功能:

累加器A的内容为1转移到目标地址,为0顺序执行

指令:JC rel(LABEL)               功能:累加器C的内容为1转移到目标地址,SEO靠我为0顺序执行

指令:JNC rel(LABEL)            功能:累加器C的内容为0转移到目标地址,为1顺序执行

指令:JB  bit,rel(LABEL)         功能:bit的内容为1转移到目标地址,为0顺序执行

指令:JNSEO靠我B bit,rel(LABEL)功能:bit的内容为0转移到目标地址,为1顺序执行

指令:JBC bit,rel(LABEL)        功能:bit的内容为1转移到目标地址并且bit置0,为0顺序执行

指令:CJNSEO靠我E A,direct,rel(LABEL)

指令:CJNE A,#data,rel(LABEL)

指令:CJNE Rn,#data,rel(LABEL)

指令:CJNE @Ri,#data,rel(LABESEO靠我L)

功能:两数进行比较,目的操作数大于源操作数跳转并且CY置0,目的操作数小于源操作数跳转并且CY置1,两数相等则顺序执行

指令:DJNZ  Rn ,rel(LABEL)

指令:DJNZ  direct SEO靠我,rel(LABEL)

功能:目的操作数自减1,结果不为0跳转,结果为0顺序执行

注:rel代表偏移量,最大偏移为-128~127,LABEL代表标号 

子程序调用及返回指令 

长调用指令:LCALL  addrSEO靠我16指令转移范围:64KB,整个ROM空间

短调用指令:ACALL  addr11     指令转移范围:2KB

子程序返回指令:RET               功能:子程序最后一条指令RET,子程序结束标志

中断返回指令:RETI                 功能:中断SEO靠我程序最后一条指令RETI,中断程序结束标志

空操作指令 

NOP    此指令执行时间为1个机器周期

功能:常用来产生一个机器周期时间的延迟

伪指令

伪指令的定义

伪指令是汇编语言中起解释说明的命令,不是单片机的指SEO靠我令。伪指令向编译系统说明程序在程序存储器的哪个区域,到何处结束等

设置起始地址伪指令 ORG

ORG  xxxxH 

功能:设置程序从程序存储器的xxxxH单元开始存放。

注:在汇编语言中ORG可多次定义,但规SEO靠我定的地址由小到大安排,各段地址不允许重叠

ORG 0000H ;当单片机上电时,从0000H开始执行命令,0000H装入了跳转到MAIN的指令 LJMP MAIN ;0000H地址装入此SEO靠我命令 ORG 0030H ;主程序从0030H开始,避免与中断程序发生冲突 MAIN:SETB P1.1;0030H地址中装入此命令

赋值伪指令 EQU 

变量代号 EQU SEO靠我数值

功能:用来给变量代号赋值,这个值可能是单元地址或立即数。

注:在同一个源程序中,任何一个变量代号只能赋值一次 

LEN EQU 20;在程序变量中 LEN 代表20 Xdata EQU SEO靠我4F8BH ;程序中变量Xdata的值为4F8BH

定义字节数据伪指令 DB 

[单元地址代号:]   DB    data

功能:用来说明ROM内容是一个字节的常数data,可定义一个或多个单元为常数

;;;SEO靠我可定义在ORG之后;;; ORG 1000H TABLE: DB 30H,63H,0DH;;;可定义在源程序末尾;;; ;;;将TABLE中第一个数送入SEO靠我R2中;;; ORG 0030H MAIN:MOV DPTR, #TABLE;MOV R2,#00HMOV A,R2;MOV A,@A+TABLE;MOV R2,A; SEO靠我 TABLE: DB 30H,63H,0DH

定义双字节数据伪指令 DW

[单元地址代号:]   DW    data16

功能:用来说明ROM内容是两个字节的常数data16,使用方法与DBSEO靠我类似

位地址赋值伪指令 BIT

变量代号  BIT  位地址

功能:把位地址赋予指定的变量代号

LED BIT P1.0;用LED替代P1.0位地址

汇编结束伪指令END 

END

功能:告知编译系统,源程序到此结束SEO靠我

注:一个程序中,只允许出现一条END伪指令且必须安排在源程序的结尾

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2