29
1 第5第 第第第第第第第 电电电电电 电电电 Tel:86413623 E-mail:[email protected] MCS-51 电 电 电 电 电 电 电 电

第 5 讲:汇编程序的编写

  • Upload
    mele

  • View
    306

  • Download
    0

Embed Size (px)

DESCRIPTION

MCS-51 单 片 机 原 理 及 设 计. 第 5 讲:汇编程序的编写. 电气工程系 赵志衡 Tel:86413623 E-mail:[email protected]. MCS-51 汇 编 程 序 的 编 写. 课程主要内容. 汇编程序的基本知识 常用汇编程序设计方法. 汇编程序的基本知识. 汇编指令的基本结构: [ 标号 ] :操作码助记符 [ 第 1 操作数 ],[ 第 2 操作数 ] ; [ 注释 ] Loop1: mov a, #0ffh; 累加器 A 赋值为 ff - PowerPoint PPT Presentation

Citation preview

Page 1: 第 5 讲:汇编程序的编写

1

第 5 讲:汇编程序的编写

电气工程系赵志衡

Tel:86413623E-mail:[email protected]

MCS-51 单 片 机 原 理 及 设 计MCS-51 单 片 机 原 理 及 设 计

Page 2: 第 5 讲:汇编程序的编写

2

课程主要内容

• 汇编程序的基本知识• 常用汇编程序设计方法

MCS-51 汇 编 程 序 的 编 写 MCS-51 汇 编 程 序 的 编 写

Page 3: 第 5 讲:汇编程序的编写

3

汇编程序的基本知识

汇编指令的基本结构:[ 标号 ] :操作码助记符 [ 第 1 操作数 ],[ 第 2 操作数 ] ; [ 注释 ]Loop1: mov a, #0ffh; 累加器 A 赋值为 ff mov a,#10h mov a,#16 标号:表示该指令所在的符号地址,一般由字母和数字组成, 第一位为字母,其余位为字母、数字任选。操作码助记符、第 1 操作数和 第 2 操作数:指令的核心部分。对于

某些指令可能不存在完整的两个操作数。注释:是由用户加入的文本,对汇编程序不起任何作用,只是方便

阅读。 * 第 1 操作数又称目的操作数,第 2 操作数又称源操作数 ** 51 不区分大小写

Page 4: 第 5 讲:汇编程序的编写

4

汇编程序的基本知识

• 汇编语言的构成– 指令性语句( 51 指令系统)– 指示性语句:伪指令– 伪指令:伪指令不属于 MCS51 指令系统中的指令,

它是程序员发给汇编程序的命令,也称为汇编程序控制命令。

• 程序设计流程

Page 5: 第 5 讲:汇编程序的编写

5

常用的部分伪指令• ORG

• END

• EQU

• DB

Page 6: 第 5 讲:汇编程序的编写

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 指令为常量标号赋值。

Page 7: 第 5 讲:汇编程序的编写

7

伪指令简介 DB 定义字节指令

[ 标号 ] : DB 数据列表 DB 指令用于定义字节型数据或数据串,并将数据作

为常数填入指定的存储器单元中。 END 结束汇编指令 [ 标号 ] : END

END 指令置于程序结尾处,作为源程序结束的标志。

Page 8: 第 5 讲:汇编程序的编写

8

程序设计流程

( 1 )明确要求和要达到的目的( 2 )确定解决问题的计算方法和步骤( 3 )画出流程图( 4 )分配内存地址( 5 )按流程图编写程序( 6 )上机汇编、调试、修改直至最后确定源程序

Page 9: 第 5 讲:汇编程序的编写

9

程序结构: 顺序结构 循环结构

分支结构 子程序结构

复合结构:多种程序结构的组合

……

Page 10: 第 5 讲:汇编程序的编写

10

简单程序(顺序结构)

• 大量使用数据传送类指令• 注意正确选择指令以提高效率

Page 11: 第 5 讲:汇编程序的编写

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

Page 12: 第 5 讲:汇编程序的编写

12

BCD 码与 ASCII 码对照• 0——30H 1——31H

• 2——32H 3——33H

• 4——34H 5——35H

• 6——36H 7——37H

• 8——38H 9——39H

Page 13: 第 5 讲:汇编程序的编写

13

分支程序

• 根据程序要求无条件或有条件改变程序执行的顺序,选择程序的流向

• 特点:程序中含有转移类指令• 关键:正确选用转移指令

Page 14: 第 5 讲:汇编程序的编写

14

正确运用转移指令• 无条件分支程序

– 程序设计者事先设计好的– LJMP

• 有条件分支程序– 根据已经执行的程序中标志位、 A 或内部 RA

M 的某些位的结果决定程序的流向– JZ/JNZ 、 CJNE 、 DJNZ 、位控制转移类指令( JC 、 JNC 、 JB 、 JNB 、 JBC )

Page 15: 第 5 讲:汇编程序的编写

15

注 意• 使用条件转移指令形成分支前一定保证供条件转移指令进行判别的条件是有意

义的。JC LOOP

• 正确选定所用的转移条件及转移目标地址

Page 16: 第 5 讲:汇编程序的编写

16

循环程序

• 循环初始化– 循环次数计数器、工作寄存器设初值等

• 循环体– 尽量简练

• 循环控制– 检查结束条件,及时退出循环

Page 17: 第 5 讲:汇编程序的编写

17

注意循环嵌套

允许外重循环嵌套内重循环循环体不能交叉不能从循环程序外部跳入循环程序内部

Page 18: 第 5 讲:汇编程序的编写

18

例: 10 个数据排序 • 常用气泡法(两两比较法):它先使 E0 和

E1 进行比较,若 E0>E1, 则两数交换 , 否则不动 , 然后 E1 和 E2 进行比较 , 按同样的原则 , 决定是否交换 , 一直比较下去 , 最后完成 E8 和 E9 的比较及交换。经过 10-1 次比较后, E9 位置必然得到数组中的最大值。犹如一个气泡冒到水顶,如此循环即可完成排序。

Page 19: 第 5 讲:汇编程序的编写

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

Page 20: 第 5 讲:汇编程序的编写

20

查表程序的设计

主要用于• 复杂代码转换显示• 数据补偿:传感器补偿• 复杂函数计算: Y=SIN(X)

Page 21: 第 5 讲:汇编程序的编写

21

查表指令• 在 51 中建议使用的查表指令为 MOVC A , @A+DPTR

最好不用 MOVC A,@A+PC !

Page 22: 第 5 讲:汇编程序的编写

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

Page 23: 第 5 讲:汇编程序的编写

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

Page 24: 第 5 讲:汇编程序的编写

24

子程序的设计 • 子程序和运算程序是程序设计的两大支柱。

• 子程序的概念:完成确定任务 , 并能为其他程序反复调用的程序段。要求子程序在结构上具有通用性和独立性。

例如:代码转换,运算程序等。

Page 25: 第 5 讲:汇编程序的编写

25

子程序编写的注意事项• 子程序调用: LCALL• 子程序返回: RET• 子程序嵌套注意的问题 : 嵌套深度与堆栈区大小的问题 .

• 子程序第一条必须有标号 .• 正确传递参数 : 入口参数和出口参数 .• 注意现场的保护和恢复

Page 26: 第 5 讲:汇编程序的编写

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

Page 27: 第 5 讲:汇编程序的编写

27

作业 1 :硬件的基本操作

如何对 sfr 中的内容进行读写?

如何对 52 系列单片机的高 128 字节RAM 进行读写?

如何读出片外数据存储器字节地址为 2000H 中的内容?

Page 28: 第 5 讲:汇编程序的编写

28

作业 2 :显示子程序编制

• 编制一个显示子程序• 要求:待显示量存放在 R1 中,得到的显示码

存放在 R2 中。• 数码管段与数据位关系,显示为低电平驱动

Page 29: 第 5 讲:汇编程序的编写

29

END