4-汇编程序设计

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

4.1.2 编制程序的步骤
1.任务分析(硬件、软件系统分析)
2.确定算法 3.程序总体设计和流程图绘制
关于流程图符号:
开始、结束----圆角矩形 开始
结束
工作任务----矩形
判断分支----菱形
程序流向----
程序连接----
4. 分配内存,确定程序与数据区存放地址; 5. 编写源程序; 6. 调试、修改,最终确定程序。
;R7×2A ; 暂存A于R3 ;取高位地址
PM0:… PM1:…
;取低位地址 ;转移地址送入DPTR
TAB TAB+2
PM0高位 PM0低位 PM1高位 PM1低位
例3:根据R0的值转向7个分支程序。
R0<10,转向SUB0; R0<20,转向SUB1;
R0<60,转向SUB5; R0≥60,转向SUB6;
开始
设置循环初值
循环处理
循环修改 N
循环结束? Y
结束处理
结束
开始
设置循环初值 Y
循环结束? N 循环处理
循环修改
结束处理
结束
例1 将内部RAM中起始地址为data的数据串送到外 部RAM中起始地址为buffer的存储区域中,直到发现 ‘$’字符,传送停止----循环次数事先不知道先判 断,后执行。
Y 条件成立?
N 程序段A
下条指令
条件成立? Y
N
程序段B 程序段A
双分支结构1
双分支结构2
4.3.2 分支程序
多分支结构
例1:设变量x以补码形式存放在片内RAM 30H单 元中,变量y与x的关系是:
x, y 20H,
x 5,
x0 x0 x0
编程根据x的值,求y值并放回原30H单元。
常用的伪指令
DW(Define Word) 从指定单元开始定义(存储)若干个字的数据 或ASCII码字符。
格式:DW 字常数或ASCII字符
例: ORG 2000H DW 1234H,’B’ DW 0AH,20
;不足则自动补充一个字节
常用的伪指令
定义空间伪指令 DS
从指定地址开始,保留由表达式指定的若干字节空间作
A,#0F0H ; A←0F0H
数据表示形式: 二进制(B)、十六进制(H)、十进制(D或省略)、 ASCII码(以单引号标识)
3.伪指令:控制汇编用的特殊指令,这些指令不属 于指令系统,不产生机器代码。
常用的伪指令
ORG (Origin) 定位程序或数据存储区的起始地址。 格式: ORG 表达式 如:ORG 1000H
4.1.3 方法技巧
1. 模块化设计(按功能分:显示、打 印、输入、发送等)
2. 尽量采用循环及子程序结构(节省内存)
4.1.4 汇编语言的规范
1. 汇编语言源程序由以下两种指令构成 基本指令(指令语句) 伪指令(指示性语句)
2. 汇编语句的格式:
标号: 操作码 操作数 ;注释
START: MOV
1
ORL A,#30H ;低4位BCD码转换位ASCII码
1
MOV 22H,A
END 13
方法 2
开始
0 (21H) (20H)A A与(21H)的低4位交换
(21H)+30H(21H) A的高低半字节交换
A+30HA A(22H)
结束
周期数 源程序
ORG 2000H
1 MOV R0,#21H
DIV AB
;A/10,商在A中
CLR C
RLC A
;A←2×A
JMP A+DPTR ;PC ← A+DPTR
TAB: AJMP SUB0
;转移指令表
AJMP SUB1
……
AJMP SUB6
4.3.3 循环程序
循环程序一般由: 初始化部分 循环体部分 循环控制部分 结束部分
一般有两种结构: 先进入处理部分,再控制循环 • 至少执行一次循环体 先控制循环,再进入处理部分 • 循环体是否执行,取决于判断结果。
B+30HB B(21H)
ห้องสมุดไป่ตู้
A+30HA A(22H)
结束
A:高4位BCD码 B:低4位BCD码
周期数 源程序
ORG 2000H
1
MOV A,20H
2
MOV B,#10H ;除以10H
4
DIV AB
; 商->A,余数->B
2
ORL B,#30H ;高4位BCD码转换位ASCII码
2
MOV 21H,B
• 注:表达式必须为16位地址值,同一源 程序中可多次使用,自小至大,不能重叠。
END 汇编语言程序结束伪指令。 注:一定放在程序末尾!汇编程序对END
后语句不予理睬
常用的伪指令
EQU (EQUate) 赋值伪指令。 格式: 字符名称 EQU 数值或汇编符号
例: AA K1
EQU 30H EQU 40H MOV A,AA MOV A,K1
SJMP ED
NEXT:MOV 30H,#20H
ED:END
多向分支程序设计
分支地址表
各分支程序的首地址组成一个表
转移指令表
转移指令组成一个表,各转移指令的目标地址即为分支 程序的首地址
地址偏移量表
各分支程序的首地址与地址偏移量表的标号之差称为地 址偏移量
例1:8路分支程序,要求程序根据其运行中所产生的寄存 器R7的值,来决定如何进行分支。
MOV R0,#data MOV DPTR,#buffer LOOP1:MOV A,R0 CJNE A,#24H,LOOP2 SJMP LOOP3 LOOP2:MOVX DPTR,A INC R0 INC DPTR SJMP LOOP1 LOOP3:END
;判断是否为$字符 ;是,转结束 ;不是,传送数据
2、机器汇编
两次扫描过程。 第一次扫描:检查语法错误,确定符号名字;
建立使用的全部符号名字表; 每一符号名字后跟一对应值(地址或数)。 第二次扫描:是在第一次扫描基础上,将符号地址转换成 地址(代真); 利用操作码表将助记符转换成相应的目标码。
§4.3 程序设计基础与举例
4.3.1 顺序结构程序
; (30H)→A ;(40H)→A
常用的伪指令
DB(Define Byte) 从指定单元开始定义(存储)若干个字节的数
据或ASCII码字符,常用于定义数据常数表。 格式:DB 字节常数或ASCII字符
例: ORG 1000H DB 34H,0DEH,’A’,’B’ DB 0AH,0BH,20
——分支地址表法
START:MOV DPTR,#TAB MOV A,R7 ADD A,R7 MOV R3,A MOVC A,A+DPTR XCH A,R3 INC A MOVC A,A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP A+DPTR
TAB: DW PM0 DW PM1 … DW PM7
地址 目标码 源程序 ORG 1000H
1000H 747F MOV A,#7FH 1002H 7944 MOV R1,#44H
END
汇编程序的汇编过程 汇编有两种方法:手工汇编、机器汇编。
1、手工汇编: 第一次汇编:确定地址,翻译成各条机器码,字符标号 原样写出; 第二次汇编:标号代真,将字符标号用所计算出的具体 地址值或偏移量代换。
例3:排序程序设计。 若以30H为首地址的内部RAM中有7个连续存放的数
据,按由小到大的次序排好后存入这7个单元。
冒泡法排序基本思想: 是一种相邻数互换的排序方法。执行时从前向后依次 将相邻两单元的数进行比较,即第一个数与第二个数、 第二个数与第三个数……进行比较,如果符合从小到 大的顺序则不变动,否则将它们交换位置。如此反复 比较和交换,使小数向前移、大数向后移,直到数列 排好为止。
放于程序开头、结尾均可。
常用的伪指令
BIT 位地址符号指令。 把位地址赋于规定的字符名称。
格式:字符名称 BIT 位地址
例: ABC BIT P1.1 QQ BIT P3.2
§4.2 汇编语言程序编辑和汇编
1. 编辑(源程序,以.ASM扩展名存盘); 2. 汇编(手工或机器汇编); 如:MOV A,#88H;机器码74,88H 又如:
例3:说明程序功能(书P109 4.1)
ADD1:
MOV A, R2 ADD A, #1 MOV R2, A MOV A, R3 ADDC A, #0 MOV R3, A RET
4.3.2 分支程序
分支程序可根据要求无条件或条件地改变程序执行 流向。编写分支程序主要在于正确使用转移指令。分支 程序有:双分支结构、多分支结构(散转)
;传送下一数据
思考:程序执行后,A=? (书P109 4.2)
LOOP:
MOV CLR ADD DJNZ RET
R2, #0AH A A, R2 R2, LOOP
例2、设8051使用12MHz晶振,试设计延迟100ms的延时程序。
延时程序的延迟时间就是该程序的执行时间,通常采用 MOV 和DJNZ二指令。
1 MOV R0,#0
;清21H单元
1 MOV A,20H
1 XCHD A,R0
;低4位BCD码送21H单元,
2 ORL 21H,#30H ;低4位BCD码转换位ASCII码
1 SWAP A
1 ORL A,#30H
;高4位BCD码转换位ASCII码
1 MOV 22H,A
9 END
方法 3 (思考……)
转移指令表法: 利用JMP A+DPTR 指令直接给PC赋值,使程序
实现转移。
K=0 转SUB0
开始
K=R0/10 K=1 …… 转SUB1
结束
K≥6 转SUB6
多向分支程序流程图
参考程序如下:
ORG 2000H
MOV DPTR,#TAB ;转移指令表首地址
MOV A,R0 MOV B,#10
;取数
为实现8路分支,可以多次使用比较转移指令:CJNE R7, #data , rel,但这样比较次数太多,当分支较大 时,执行速度就较慢。
可以用变址寻址的转移指令JMPA+DPTR使问题得到 解决。首先安排存放一个转移分支入口的地址表,把入 口地址表的首地址送到DPTR,再把R7的内容送累加器 A。
例2 :根据R7的内容,转至对应的分支程序。设R7的内容 为0~7,对应的处理程序地址分别为PM0~PM7
机器周期 T = 12 / fosc = 12 / (12×106)= 1us
ORG 1000H
DELAY:MOV R2,#199
;CTS = 199
LOOPS:MOV B,#250
;CTR = 250
LOOPR:DJNZ B,LOOPR
;2T = 2us
DJNZ R2,LOOPS
;2T = 2us
开始 取x 即(30H) A
>0
y=x
A=?
0
y=20H
<0
y=x+5
存y 即y 30H 结束
ORG 1000H
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
例1:变量存在内部RAM的20H单元中, 其取值范围:0~5,用查表法编程求其 平方值,结果送到21H单元
开始
表格首地址送DPTR 变量送A(20H) A 查平方表(A+DPTR) A 结果送21H单元:A 21H
结束
ORG 1000H START:MOV DPTR,#TABLE
MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000H TABLE:DB 0,1,4,9,16,25
例2:将20H单元的压缩BCD码 低四位和高四位,分别拆成 两个ACSII码存入21H、22H单 元。
(BCD ASCII 码对照表)
20H
BCD
ASCII
21H
0
30H
22H
1
31H
2
32H
3
33H


9
39H
内部RAM






69 39 36
方法 1
开始
(20H)A
A取高四位,B取低四位
为备用空间。
格式: [标号:]
DS 表达式

ORG 1000H
DS 0AH
DB 71H,11H,11H ;从100BH开始存放
;71H、11H、11H。
常用的伪指令
数据地址赋值伪指令 DATA
将表达式指定的数据或代码地址赋予规定的标号
格式:
标号 DATA 表达式
注:该指令与EQU指令相似,只是,可先使用后定义,
END
内循环延时: ( 2 × CTR)T = 500us(假设)
则CTR = 250
总延时:T +(1T+500T + 2T)× CTS = 100ms = 100 000us 所以 , CTS = 198.8 取 199 实际延时:[1 + (501 + 2)×199] = 100.098ms
第四章 汇编语言程序设 计
通过前面的学习,我们已经了解了单片机内部的 结构,MCS-51指令系统的寻址方式、各类指令的格式 及功能。
下面我们就是要如何利用MCS-51的指令系统,来 编写高效、充分利用其特点的程序。
§4.1 概述
4.1.1 程序设计语言
1. 机器语言 2. 汇编语言 3. 高级语言
相关文档
最新文档