打印
[疑难问答]

汇编指令合集

[复制链接]
2678|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alvpeg|  楼主 | 2024-6-25 23:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
指令格式
指令由  标号、操作码、操作数、注释 四部分构成,格式如下

[标号]: 操作码  [操作数] ;[操作数]
标号:用来替代指令代码的第一个字节所在单元地址,由用户自行定义,字母开头分。
注:一般一段代码需要一个标号用来标记,方便跳转操作。

操作码:规定指令所执行的操作
操作数:参与操作的数据信息
注释:程序注释,增加程序的可读性
编程格式:标号后用(:)隔开,操作码与操作数用空格隔开,注释与指令用(;)隔开

编译语句实例
[标号]   [操作码]    [操作数]   [注释]
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


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

1470

帖子

0

粉丝