51单片机(宏汇编)指令集5

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


符号“$”在转移指令中当作label使用时,表 示转到$符号所在行的前面,例如: SJMP $ 表示在本行作“死循环”。等效于: ABC: SJMP ABC
判断下列标号和变量定义是否正确



LAB+3: MOV A,30H LAB USB: MOV A,30H SUBB: MOV A,30H LAB: MOV A,MEN+3 R7: MOV A,30H MOV R7,A+3 SJMP $
单片机原理及应用5
51单片机宏汇编和程序结构
51单片机的汇编语言(宏汇编)




只有指令助记符还不能编写出好程序,需要增 添一些“伪指令”。 伪指令用于控制汇编软件如何处理和按什么规 则编译程序。 伪指令不会产生“机器码” 不同的汇编器(仿真器、仿真软件)具有一些 不同的“伪指令”规定。 下面将介绍一些常用的伪指令
ASM51汇编语言格式
【label:】指令助记符 【操作数1】【 ,操作数2】【,操作数3】【注 释】
1.
2.
Label: 标号,冒号结尾,表示程序入口。 字母开头,通常少于8个字符。 指令助记符:也可以是伪指令,后面如果有 操作数的话必须有“空格”或“TAB-键” 将其与操作数分开
ASM51汇编语言格式
TAB1: DB 0C0H,0F9H, DB 0A4H ,0B0H, DB 099H,092H,082H DB ,0F8H,080H,090H 表格中依次定义了从“0~ 9”的共阳LED数码管显 示“7段码”
使用MOVC A,@A+PC时 注意“地址调整参数”



当前PC值到数据表之间,间隔多少字节,就是的 “地址调整参数”。 这个参数必须加到A中再查表。 这个参数需要认真计算,没有公式可用。方法就 是:计算查表指令之后的每条指令的字节数,直 到数据表之前,把这些字节数加在一起就是需要 的“地址调整参数” 。
赋值命令



EQU 赋值命令。定义变量地址或者常数名称。 格式: 字符名称 EQU (数或汇编符号) 赋值后的符号名称可做:数据地址\代码地址\代 码地址\立即数\寄存器名 例如: ABC EQU 30H ABC EQU R7 不能重名定义
赋值命令



DATA 数据地址赋值命令 格式: 字符名称 DATA 表达式 注意: 表达式可求值(数据) 可以后定义先使用 ABC DATA 30H ABC DATA 30+20 不能重名定义
ASM51汇编伪指令EQU/BIT
SFLAG BIT P1.0 ;定义SFLAG变量为P1.0引 脚 SIGN EQU 00H ;定义SIGN变量为位地址 00H MOV C, SIGN 有些编译器可以用EQU完全代替BIT来定义“位”
ASM51汇编伪指令DB/DW

DB 定义8位数据段(表格类常数) 格式: DB 项或表 项或表:字节/字节串/字符串
ຫໍສະໝຸດ Baidu
数值运算


汇编语言对常量允许进行算术运算,逻辑运算,分离 运算等三种类型的运算。 运 算 操 作 含 义 以ADD为例 + 加操作 ADD A,#RR1+36 减操作 ADD A,#RR1-2EH * 乘操作 ADD A,#RR1*0E3H / 除操作 ADD A,#RR1/23 MOD 模除 ADD A,#RR1 MOD 12
常量及其表示


常量,就是在汇编时已经确定的值。 在汇编 语言中,常量主要用作指令性语句中的直接操 作数 ,也可用于存储器操作的组成部分(如位移 量,或者为伪指令中的变量输初值。 ) 常量有多种表示形式:二、十、十六进制数和 字符串等
常量及其表示

数据形式 备 注
格 式
取值范围




2进制 ********B 0,1 0进制 ****** 0, 1,2...9 ****H 0,1...E,F 0CDE3H 符应是0--9 ASCII '**' ASCII 'AD' 使用
数值运算


操 作
含 义
以ADD为例


SHR 右移 ADD A,#RR1 SHR 3 SHL 左移 ADD A,#RR1 SHL 2 AND 与操作 ADD A,#RR1 AND 10000101B OR 或操作 ADD A,#RR1 OR 00110000B
数值运算


操 作
XOR NOT HIGH LOW
10110011B 32768 16进制 最前面一个字 只有DB命令中
常量及其表示



常量以数值形式直接写在汇编语言的语句中称 为字面常量。 若预先为它定义一个符号名,然后在语句中用 符号名来表示该常量称符号常量。 使用符号常量的优点可改善程序的可读性,它 的定义需要使用伪操作命令“EQU”或“= ” 。
ASM51汇编伪指令DB/DW
DW
定义16位数据段(表格类常数)
16位项或表
格式: DW
16位项或表:字节/字节串/字符串
ASM51汇编伪指令DB/DW
ORG TAB2:


2000H DW 0C0F9H,0A4B0H,10H,8AH DW …… (2000H)= C0H (2001H)= F9H (2002H)= A4H (2003H)= B0H (2004H)= 00H (2005H)= 10H (2006H)= 00H (2007H)= 8AH
常见线性程序的结构
主程序入口 中断程序1 中断程序n
初始化
其他子程序、 中断服务等
允许中断 中断返回 中断返回
循环体
循环体常为显示和键盘管理 中断过程往往发生在循环体的某两条指 令之间,不可预测。
一般程序的一般结构(局部)



程序的局部可以设计成如下结构之一 顺序结构 循环结构 分支结构 子程序调用结构:模块化结构
下面定义是否正确?
ABC EQU 30H ABC EQU R7 ABC EQU 3023H ABC EQU DPTR ABC DATA 30H ABC DATA 30+20 ABC DATA R7 ABC DATA SP+20

位变量地址定义
BIT 定义位变量地址,用法与EQU相同。有时 可以用EQU代替。 格式: 字符名称 BIT 位地址 例如: fire bit p1.0 或者: fire equ p1.0
子程序


能被其他程序调用,在实现某种功能后能自 动返回到调用程序去的程序。 其最后一条指令一定是返回指令,故能保证 重新返回到调用它的程序中去。也可调用其 他子程序,甚至可自身调用(如递归)。
KEY_NOF: MAINLOOP: CJNE A,#0EH,KEYNE LCALL KEYSCANG LCALL E_PROC CJNE A,#80H,KEYPRO AJMP MAINLOOP …… LCALL DISPLAY AJMP MAINLOOP AJMP MAINLOOP KEYPRO: CJNE A,#0FH,KEY_NOF LCALL F_PROC AJMP MAINLOOP
软件陷阱:


所谓软件陷阱,就是一条引导指令,强行将乱 飞的程序引向一个指定的地址,在那里有一段 专门对程序出错进行处理的程序。 如果我们把这段程序的入口标号称为ERR的话, 软件陷阱即为一条LJMP ERR指令。
顺序结构
RED

GRE
YEL

按顺序一条条执行 的程序.也称为直线 程序 例如:已知RED;GRE 和YEL为连续3个存 储单元,将其依次 右移1位 MOV A,YEL MOV C,ACC.0
MOV A,RED RRC A MOV RED,A MOV A,GRE RRC A MOV GRE,A MOV A,YEL RRC A MOV YEL,A
分支结构

“分支”通常都是有条件的 按“功能号”分支,就是“散转” 按条件分支,可以是标志位,可以是运算结果, 相当于“如果满足条件就……否则就……”
查表举例
指令MOV A,@A+DPTR和 MOV A,@A+PC SERCH1: MOV A,BUFF MOV DPTR,#TAB1 MOVC A,@A+DPTR LJMP DISPLAY …… TAB1:
SERCH2: MOV A,BUFF ADD A,#03H ;**** MOVC A,@A+PC LJMP DISPLAY TAB1:DB 0C0H,0F9H, DB 0A4H ,0B0H, DB 099H,092H,082H DB ,0F8H,080H,090H 上例中: LJMP DISPLAY是3字节,因此前面有: ADD A,#03H
ASM51汇编伪指令ORG举例
ORG 0000H AJMP MAIN NOP ORG 0003H LJMP INT0SAV 服务程序 ORG 000BH LJMP T0SAV ORG 0030H
;跳转到INT0
;跳转到T0服务程序
MAIN: 主程序
ASM51汇编伪指令ORG举例


意义:主程序从地址0000开始,实际又跳转到 0030H开始的主程序。INT0发生中断时,程序从 0003H开始执行,并跳转到INT0SAV程序执行。 T0发生溢出中断时,从000BH开始执行。 这几个地址值是51单片机规定的固定地址,在 “中断系统”中再详细讨论
DS预留空间命令


DS 预留一个数据段(单片机中不常用,因为 只能在程序段中定义,而程序ROM是不能修改 的) 格式: DS 表达式


ORG 1000H DS 08H DB 30H,8AH
(1008H)= 30H (1009H)= 8AH


注意,定义的都是程序寄存器
汇编语言程序的一般结构
循环结构
MOV A,YEL MOV C,ACC.0 需要重复执行的 程序, MOV R0,#RED 结构一般包括: MOV R7,#3 ;循环3次 设置循环初值 LOOP: MOV A,@R0 循环体 RRC A 修改控制变量 MOV @R0,A 修改控制 INC R0 DJNZ R7,LOOP RET
ASM51汇编伪指令DB/DW
ORG TAB1:


2000H DB 0C0H,0F9H,0A4H,0B0H,099H DB „ABC‟ (2000H)= C0H (2001H)= F9H (2002H)= A4H (2003H)= B0H (2004H)= 99H (2005H)= 41H (2006H)= 42H (2007H)= 43H
含 义
以ADD为例
异或操作 ADD A,#RR1 XOR 36H 非操作 ADD A,#NOT 45H 高字节分离 ADD A,#HIGH 05E2H 低字节分离 ADD A,#LOW 77F0H
ASM51汇编器通用伪指令




汇编起始命令 ORG 16位地址 (常数或表达式 ) 定义程序/数据的起始地址 ORG $+5 ORG 0008H 汇编结束命令 END 汇编到此结束,其后面的内 容将被忽略。同时也是程序结束的标志。
1. 2.
3.
4.
操作数1:既是操作对象又是操作结果 如果存在操作数2、3时,需要在前面用逗号隔 开 注释:前面用分号开头(半角字符),后面可以 用中文注释 【】表示不一定存在,不是必须的
ASM51汇编保留字和特殊符号


保留字常指:指令;寄存器名;伪指令, 以及运算符号如:+-×/等,这些字符串 不能用于作为标号、变量等,运算符不能 用于标号、变量当中。 运算符可以用于操作数中,起到运算作用。 例如:MOV MEM+3,A,意义为:将A的 内容送到MEM之后的第三个存储单元。
程序的一般结构按照下面顺序组成: 1. 用EQU/BIT定义变量、常量、端口 2. 用ORG指令和LJMP/AJMP定义中断向量 表 3. 主程序:初始化堆栈、内存、端口、中断 系统、允许中断,然后进入一个扫描循环 体。
汇编语言程序的一般结构
4 独立模块区:子程序、中断服务程序等程 序模块区。 5 用END作为程序结束。

ASM51汇编伪指令EQU/BIT
TEMP EQU 30H ;定义变量TEMP地址为30H T_MOD EQU 40H ;定义定时器模式控制字常 量=40H EQU之前的字符串可以理解为变量名,也可以理 解为常量名,只要应用时前面加上“#”就是常量 了!例如: MOV TEMP,#TEMP 这条指令使30H地址内存入30H常数
相关文档
最新文档