第 5 讲:汇编程序的编写
DESCRIPTION
MCS-51 单 片 机 原 理 及 设 计. 第 5 讲:汇编程序的编写. 电气工程系 赵志衡 Tel:86413623 E-mail:[email protected]. MCS-51 汇 编 程 序 的 编 写. 课程主要内容. 汇编程序的基本知识 常用汇编程序设计方法. 汇编程序的基本知识. 汇编指令的基本结构: [ 标号 ] :操作码助记符 [ 第 1 操作数 ],[ 第 2 操作数 ] ; [ 注释 ] Loop1: mov a, #0ffh; 累加器 A 赋值为 ff - PowerPoint PPT PresentationTRANSCRIPT
1
第 5 讲:汇编程序的编写
电气工程系赵志衡
Tel:86413623E-mail:[email protected]
MCS-51 单 片 机 原 理 及 设 计MCS-51 单 片 机 原 理 及 设 计
2
课程主要内容
• 汇编程序的基本知识• 常用汇编程序设计方法
MCS-51 汇 编 程 序 的 编 写 MCS-51 汇 编 程 序 的 编 写
3
汇编程序的基本知识
汇编指令的基本结构:[ 标号 ] :操作码助记符 [ 第 1 操作数 ],[ 第 2 操作数 ] ; [ 注释 ]Loop1: mov a, #0ffh; 累加器 A 赋值为 ff mov a,#10h mov a,#16 标号:表示该指令所在的符号地址,一般由字母和数字组成, 第一位为字母,其余位为字母、数字任选。操作码助记符、第 1 操作数和 第 2 操作数:指令的核心部分。对于
某些指令可能不存在完整的两个操作数。注释:是由用户加入的文本,对汇编程序不起任何作用,只是方便
阅读。 * 第 1 操作数又称目的操作数,第 2 操作数又称源操作数 ** 51 不区分大小写
4
汇编程序的基本知识
• 汇编语言的构成– 指令性语句( 51 指令系统)– 指示性语句:伪指令– 伪指令:伪指令不属于 MCS51 指令系统中的指令,
它是程序员发给汇编程序的命令,也称为汇编程序控制命令。
• 程序设计流程
5
常用的部分伪指令• ORG
• END
• EQU
• DB
6
伪指令简介 ORG 起点指令 ORG addr16 org 0000h ORG 指令用于指明程序代码或数据块在存储器中的
起始地址。 addr16 代表一个 16 位地址,即程序或数据块的首地址。
EQU 等值指令 标号 EQU 表达式 aaa equ 30h bbb equ 40H mov a,aaa mov a,#bbb+1 EQU 指令用于为程序中的任意标号赋值。 程序中的常量通常可以用标号代替,便于修改。 主程序前要先用 equ 指令为常量标号赋值。
7
伪指令简介 DB 定义字节指令
[ 标号 ] : DB 数据列表 DB 指令用于定义字节型数据或数据串,并将数据作
为常数填入指定的存储器单元中。 END 结束汇编指令 [ 标号 ] : END
END 指令置于程序结尾处,作为源程序结束的标志。
8
程序设计流程
( 1 )明确要求和要达到的目的( 2 )确定解决问题的计算方法和步骤( 3 )画出流程图( 4 )分配内存地址( 5 )按流程图编写程序( 6 )上机汇编、调试、修改直至最后确定源程序
9
程序结构: 顺序结构 循环结构
分支结构 子程序结构
复合结构:多种程序结构的组合
……
10
简单程序(顺序结构)
• 大量使用数据传送类指令• 注意正确选择指令以提高效率
11
将 20H 单元内的压缩 BCD 码变换成相应 ASCII 码放在 21H 、 22H 中
• Org 0h• Ljmp 2000h• ORG 2000H• MOV R0,#22H• MOV @R0,#00• MOV A,20H• XCHD A,@R0• ORL 22H,#30H• SWAP A• ORL A,#30H• MOV 21H,A• z : SJMP z• END15BYTE ,11T
• MOV A,20H
• MOV B,#10H
• DIV AB
• ORL B,#30H
• MOV 22H,B
• ORL A,#30H
• MOV 21H,A
• SJMP $
• END
15BYTE 14T
12
BCD 码与 ASCII 码对照• 0——30H 1——31H
• 2——32H 3——33H
• 4——34H 5——35H
• 6——36H 7——37H
• 8——38H 9——39H
13
分支程序
• 根据程序要求无条件或有条件改变程序执行的顺序,选择程序的流向
• 特点:程序中含有转移类指令• 关键:正确选用转移指令
14
正确运用转移指令• 无条件分支程序
– 程序设计者事先设计好的– LJMP
• 有条件分支程序– 根据已经执行的程序中标志位、 A 或内部 RA
M 的某些位的结果决定程序的流向– JZ/JNZ 、 CJNE 、 DJNZ 、位控制转移类指令( JC 、 JNC 、 JB 、 JNB 、 JBC )
15
注 意• 使用条件转移指令形成分支前一定保证供条件转移指令进行判别的条件是有意
义的。JC LOOP
• 正确选定所用的转移条件及转移目标地址
16
循环程序
• 循环初始化– 循环次数计数器、工作寄存器设初值等
• 循环体– 尽量简练
• 循环控制– 检查结束条件,及时退出循环
17
注意循环嵌套
允许外重循环嵌套内重循环循环体不能交叉不能从循环程序外部跳入循环程序内部
18
例: 10 个数据排序 • 常用气泡法(两两比较法):它先使 E0 和
E1 进行比较,若 E0>E1, 则两数交换 , 否则不动 , 然后 E1 和 E2 进行比较 , 按同样的原则 , 决定是否交换 , 一直比较下去 , 最后完成 E8 和 E9 的比较及交换。经过 10-1 次比较后, E9 位置必然得到数组中的最大值。犹如一个气泡冒到水顶,如此循环即可完成排序。
19
将 RAM 地址为 50H~59H 中的10 个数据 , 从小到大进行排序 ( 实
验 1)Size equ 10Change equ 00HSort:mov rO, #50Hmov r7, #Size-lclr ChangeGoon:Mov a, @r0Inc r0mov B, @r0cjne a, B, NotEqualsjmp Next
NotEqual:jc Nextsetb Changexch a, @r0dec rOxch a, @r0inc rONext:Djnz r7, GoonJb Change, SortLjmp $end
20
查表程序的设计
主要用于• 复杂代码转换显示• 数据补偿:传感器补偿• 复杂函数计算: Y=SIN(X)
21
查表指令• 在 51 中建议使用的查表指令为 MOVC A , @A+DPTR
最好不用 MOVC A,@A+PC !
22
查表指令的使用例 求 0~9 的平方 ORG 0000H LJMP A1 ORG 0080HA1: NOP NOP MOV SP,#60H MOV DPTR,#2000H MOV A,#03H ;将 0~9 之内任意一个数赋值给 A 。 MOVC A,@A+DPTRA2: SJMP A2 ORG 2000H DB 00h,01h,04h,09h,10h,19h,24h,31h,40h,51h END
23
查表指令的使用例 求 0~9 的平方 ORG 0000H LJMP A1 ORG 0080HA1: NOP NOP MOV SP,#60H MOV DPTR,#tab MOV A,#03H ;将 0~9 之内任意一个数赋值给 A 。 MOVC A,@A+DPTRA2: SJMP A2Tab: DB 00h,01h,04h,09h,10h,19h,24h,31h,40h,51h END
24
子程序的设计 • 子程序和运算程序是程序设计的两大支柱。
• 子程序的概念:完成确定任务 , 并能为其他程序反复调用的程序段。要求子程序在结构上具有通用性和独立性。
例如:代码转换,运算程序等。
25
子程序编写的注意事项• 子程序调用: LCALL• 子程序返回: RET• 子程序嵌套注意的问题 : 嵌套深度与堆栈区大小的问题 .
• 子程序第一条必须有标号 .• 正确传递参数 : 入口参数和出口参数 .• 注意现场的保护和恢复
26
子程序的参数传递 (方法很多) 通过寄存器传递MAIN: MOV R0,#30H
MOV R7,#0AHACALL SUBR
mov b,r1 ………….SUBR: PUSH a mov a,r7 clr c subb a,r0 mov r1,a pop a ret end
27
作业 1 :硬件的基本操作
如何对 sfr 中的内容进行读写?
如何对 52 系列单片机的高 128 字节RAM 进行读写?
如何读出片外数据存储器字节地址为 2000H 中的内容?
28
作业 2 :显示子程序编制
• 编制一个显示子程序• 要求:待显示量存放在 R1 中,得到的显示码
存放在 R2 中。• 数码管段与数据位关系,显示为低电平驱动
29
END