第4章__汇编语言程序设计知识1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
19:13
32
四、 查表程序
----其它应用程序实例
查表程序是一种常用的程序,它广泛使用于LED显示器控 制、打印以及数据补偿、计算、转换等功能程序中,具有 程序简单、执行速度快等优点。查表,就是根据变量x在表 格中查找y,使y=f (x)。 例4-7 试编写程序,将16进制数(0-F)转换成ASCII码。 分析:16进制0~9的ASCII码为30~39H,A~F的ASCII码为 41H~46H,ASCII码表的首地址为ASCTAB。 入口:HEX单元的低四位存放16进制数。 出口:转换后的ASCII码送回HEX单元。
流程图步骤分得越细致,编写程序是也越方 便。
画流程图是程序结构设计是采用的一种重要 手段。 一个系统软件有总的流程图(主程序流程图) 和局部的流程图(子程序流程图)。 流程图常采用的图形和符号。
6
19:13
程序流程图常用的图形及符号
椭圆框 或桶形框
:表示程序的开始或结束。
矩形框
菱形框
:表示要进行的工作。 :表示要判断的事情,菱形框内 的表达式表示要判断的内容。
19:13
15
二、编程技巧
1、尽量采用循环结构和子程序。 2、尽量少用无条件转移指令。
3、对于通用的子程序,考虑到其通用性,除了用于存放 子程序入口参数的寄存器外,子程序中用到的其他寄存 器的内容应压入堆栈(返回前再弹出),即保护现场。 4、在中断处理程序中,除了要保护处理程序中用到的寄 存器外,还要保护标志寄存器。
19:13 22
---分支结构实例 例4-4 128种分支转移程序。 功能:根据入口条件转移到128个目的地址。 入口:(R3)=转移目的地址的序号00H→7FH。 出口:转移到相应于程序入口。
散转指令 K=0 K=1 ┅ ┅
K=n-1
K=n
转向0分支
转向1分支
┅
转向n-1分支
转向n分支
19:13
圆圈 指向线
19:13
:表示连接点 :表示程序的流向
7
4、编写源程序
用89C51汇编语言编写的源程序行(一条语 句)包括四个部分,也叫四个字段:
〔标号:〕 操作码 〔操作数〕;〔注释〕
每个字段之间要用分隔符分隔,而每个字段 内部不能使用分隔符。可以用作分隔符的符 号:空格“ ”、冒号“:”、逗号“,”、 分号“;”等。
5. 掌握一些常用汇编子程序的编程方法。 6. 掌握常用的一些伪指令。
19:13 2
4.1 编程的步骤、方法和技巧
4.1.1 编程步骤
1、分析问题 2、确定算法 3、画程序流程图 4、编写源程序
19:13 3
1、分析问题
对需要解决的问题进行分析,以求对问题 由正确的理解。 解决问题的任务是什么?
5、用累加器传递入口参数或返回参数比较方便,在子程 序中,一般不必把累加器内容压入堆栈。
19:13 16
4.1.3
汇编语言程序的基本结构
一、顺序程序
顺序程序是最简单的程序结构,即顺序结构。 程序按顺序一条一条地执行指令。
19:13
17
---顺序程序实例
例4-1 将片内RAM的20H单元中的压缩BCD 码拆成两个ACSII码存入21H、22H单元。 低4位存在21H单元,高4位存在22H单元。 MOV A, 20H 压缩BCD码与非压缩BCD码的区别: MOV 压缩BCD码的每一位用4位二进制表示,一 B, #10H ;除以10H 个字节表示两位十进制数。例如10010110B表示十 DIV AB 进制数96D; ORL 非压缩BCD码用1个字节表示一位十进制数, B, #30H;低4位BCD码转换为ASCII码 高四位总是0000,低4位的0000~1001表示0~9.例如 MOV 21H, B 00001000B表示十进制数8. ORL A, #30H;高4位BCD码转换为ASCII码 MOV 22H, A
14
19:13
2、模块划分的原则
每个模块应具有独立的功能,能产生一个明确的
结果,即单模块的功能高内聚性。
模块之间的控制耦合应尽量简单,数据耦合应尽 量少,即模块间的低耦合性。控制耦合是指模块 进入和退出的条件及方式,数据耦合是指模块间 的信息交换方式、交换量的多少及交换频繁程度。
模块长度适中。20条~100条的范围较合适。
例:MAIN:MOV A,#00H;立即数00H→A
19:13 8
标号:
标号是用户定义的符号地址。 一条指令的标号是该条指令的符号名字,标号的值
是汇编这条指令时指令的地址。
标号由以英文字母开始的1~8个字母或数字组成,
以冒号“:”结尾。
标号可以由赋值伪指令赋值,如果没有赋值,汇编 程序把存放该指令目标码第一字节的存储单元的地 址赋给该标号,所以,标号又叫指令标号。
单片机原理与接口技术
第4章
汇编语言程序设计知识
19:13
1
本章教学要求
第4章
汇编语言程序设计知识
1. 了解汇编语言编程的基础知识;
2. 了解汇编语言程序设计的基本步骤和方法;
3. 了解汇编语言的特点:目标程序效率高、占存 储空间少、运行速度快、实时性强等; 4. 掌握89C51汇编语言的几种结构:顺序、分支、 循环、查表及子程序的结构;
19:13
27
3、修改控制变量
在循环程序中,不许给出循环结束条件。 常见的是计数循环,当循环了一定的次数 后,就停止循环。 在单片机中,一般用一个工作寄存器Rn作 为计数器,对该计数器赋初值作为循环次 数。每循环一次,计数器的值减1,即修改 循环控制变量,当计数器的置件为0时,就 停止循环。
33
19:13
4.2.4 查表程序
----其它应用程序实例
ORG 0200H HEX EQU 33H HEXASC:MOV A, HEX ANL A, #0FH ADD A, #03H ;变址调整 MOVC A, @A+PC MOV HEX, A RET ASCTAB: DB 30H, 31H, 32H, 33H DB 34H, 35H, 36H, 37H DB 38H, 39H, 41H, 42H DB 43H, 44H, 45H, 46H END 在这个程序中,查表指令MOVC A, @A+PC到表格首地址有 两条指令,占用3个地址空间,故变址调整为加3。
11
19:13
(4)常数:可用二进制(B)、十进制、十六进 制(H),若常数以字符开头,前面加0。 (5)$:用来表示程序计数器的当前值。 (6)表达式:汇编时,计算出表达式的值填入目 标码。
19:13
12
注释
注释部分不是汇编语言的功能部分,只是用语增 加程序的可读性。
良好的注释是汇编语言程序编写中的重要组成部 分。
例4-5 将内部RAM中起始地址为data的数据串传送到外部RAM 中起始地址为buf的存储区域内,直到发现“$”字符停止传送。 本例结束条件为找到“$”停止传送。程序如下:
MOV R0, #DATA MOV DPTR, #BUF LOOP0: MOV A, @R0 CJNE A, #24H, LOOP1 SJMP LOOP2 LOOP1: MOVX @DPTR, A INC R0 INC DPTR SJMP LOOP0 LOOP2: SJMP $ ;源数据区首地址 ;目的数据区首地址 ;取数据 ;判断是否为$字符 ;是$,转结束 ;不是$,执行传送 ;修改源地址 ;修改目的地址 ;传送下一个数据
;高8位向左环移1位
19:13
19
二、分支程序
程序分支是通过条件转移指令实现的,即根据条件对程序的 执行进行判断、满足条件则进行程序转移,不满足条件就顺 序执行程序。
分支程序又分为单分支、双分支和多分支结构。
多分支程序是首先把分支程序按序号排列,然后按序号值进 行转移。 在89C51指令系统中,通过条件判断实现单分支程序转移的指 令有:JZ、JNZ、CJNE、DJNZ等。此外还有以位状态作为 条件进行程序分支的指令,如JC、JNC、JB、JNB、JBC等。 使用这些指令可以完成0、1、正、负,以及相等、不相等作 为各种条件判断依据的程序转移。
19:13 20
---分支结构实例 例4-3 设变量x以补码形式存放在片内RAM的30H单元中, 变量y与x的关系是:
编写程序,根据x的值求y的值,并放回原单元中。
19:13
21
---分支结构实例 程序如下:
START: MOV A, 30H JZ NEXT ;x=0,转移 ANL A, #80H ;保留符号位 JZ ED ;x > 0 ,转移 MOV A, #05H ;x < 0,不转移 ADD A, 30H MOV 30H, A SJMP ED NEXT: MOV 30H, #20H ED: SJMP $
19:13
31
---循环结构实例
例4-6 设89C51单片机使用12MHz晶振(机器 周期T为lµs),试计算延时时间。
ORG 4000H R5, #80H ;1个机器周期
DEYPRG: MOV
LOOP1:
LOOP2:
MOV
DJNZ DJNZ NOP RET
R6, #0FFH ;1个机器周期
R6, LOOP2 R5, LOOP1 ;2个机器周期 ;2个机器周期 ;1个机器周期 ;2个机器周期
23
JMP-128: MOV RL MOV JMP JMPTAB: AJMP AJMP … AJMP
A, R3 A DPTR, #JMPTAB @A+DPTR ROUT00 ;128个子程序首址 ROUT01 ROUT7F
19:13
24
三、循环程序 在程序运行时,有时需要连续重复执行某 段程序,可以使用循环程序。其结构包括四 部分:
1、置循环初值
2、循环体(循环工作部分)
3、修改控制变量
4、循环控制部分
19:13 25
1、置循环初值
对于循环程序中所使用的工作单元,在循 环开始时应置初值。 例如,工作寄存器设置计数初值,累加器A 清0,以及设置地址指针、长度等。
19:13
26
2、循环体(循环工作部分)
重复执行的程序段部分,分为循环工作部 分和循环控制部分。 循环控制部分每循环一次,检查结束条件, 当满足条件时,就停止循环,往下继续执 行其他程序
具体要求:初学一定要加注释!
19:13
13
4.1.2
编程的方法和技巧
一、模块化程序设计方法
1、程序功能模块化的优点
单个模块结构的程序功能单一,易于编写、调试和修改。
Biblioteka Baidu
便于分工,从而可使多个程序员同时进行程序的编写和 调试工作,加快软件研制进度。
程序可读性好,便于功能扩充和版本升级。 对程序的修改可局部进行,其它部分可以保持不变。 对于使用频繁的子程序可以建立子程序库,便于多个模 块调用。
19:13
18
---顺序结构实例
例4-2 设有16位二进制数存放在内部RAM的50H及51H单 元中,要求将其算术左移一位(即原数各位均向左移1位, 最低位移入0)后仍存放在原单元。试编制相应的程序。 BIHR : CLR C MOV A, 51H RLC A MOV 51H, A MOV A, 50H RLC A MOV 50H, A ;Cy清零 ;低8位向左环移1位
工作过程?
现有的条件,已知数据,对运算的精度和 速度方面的要求? 设计的硬件结构是否方便编程?
4
19:13
2、确定算法
算法是如何将实际问题转化成程序模块来 处理。
在编程以前,先要对几种不同的算法进行 分析、比较,找出最适宜的算法。
19:13
5
3、画程序流程图
程序流程图是使用各种图形、符号、有向线 段等来说明程序设计过程的一种直观的表示。
19:13
9
操作码
操作码是必不可少的。
它用一组字母符号表示指令的操作码。
在89C51中,由89C51的指令助记符组成。
19:13
10
操作数
汇编语言指令可能要求或不要求操作数,所以这一 字段可能有也可能没有。 若有两个操作数,操作数之间用逗号“,”分开。 操作数包括的内容有: (1)工作寄存器:由PSW.3和PSW.4规定的当前工 作寄存器区中的R0~R7。 (2)特殊功能寄存器:21个SFR的名字。 (3)标号名:赋值标号—由汇编指令EQU等赋值 的标号;指令标号—指令标号指示的指令的第一字 节地址是该标号的值。
28
19:13
4、循环控制部分
根据循环结束条件,判断是否结束循环。 89C51可采用DJNZ指令来自动修改控制变 量并能结束循环。
19:13
29
置初值 置初值 循环体 循环修改 循环控制
完
退出循环
未完
循环体
未完
循环控制
完
退出循环
循环修改
(a)
19:13
(b)
循环组织方式流程图
30
---循环结构实例