第四章 汇编语言程序设计

42

description

第四章 汇编语言程序设计. 通过前面的学习,我们已经了解了单片机内部的结构, MCS-51 指令系统的寻址方式、各类指令的格式及功能。 下面我们就是要如何利用 MCS-51 的指令系统,来编写高效、充分利用其特点的程序。. § 4.1 概述. 4.1.1 程序设计语言. 目前,用于程序设计的语言基本上分为三种:. 1. 机器语言 在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。 缺点:程序不易看懂,不便于记忆,容易出错。. 程序设计语言. 2. 汇编语言 - PowerPoint PPT Presentation

Transcript of 第四章 汇编语言程序设计

Page 1: 第四章 汇编语言程序设计
Page 2: 第四章 汇编语言程序设计

2

第四章 汇编语言程序设计

通过前面的学习,我们已经了解了单片机内部的结构, MCS-51 指令系统的寻址方式、各类指令的格式及功能。

下面我们就是要如何利用 MCS-51 的指令系统,来编写高效、充分利用其特点的程序。

Page 3: 第四章 汇编语言程序设计

3

§ 4.1 概述4.1.1 程序设计语言

1. 机器语言

在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。

缺点:程序不易看懂,不便于记忆,容易出错。

目前,用于程序设计的语言基本上分为三种:

Page 4: 第四章 汇编语言程序设计

4

2. 汇编语言

用助记符表示的指令称为符号语言或汇编语言。

汇编语言程序 ( 源程序 ) 需要“汇编” ( 由专门的汇编程序完成 ) 才能转换成机器语言。得到的机器语言程序称为目标程序。

特点:

• 是面向机器的语言,必须对硬件有一定的了解。

• 助记符指令和机器指令一一对应。

• 能直接管理和控制硬件设备(功能部件)。

程序设计语言

Page 5: 第四章 汇编语言程序设计

5

3. 高级语言

高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。

常用的高级语言,如 BASIC 、 FORTRAN 、 C 语言等。

特点:

• 通用性强,直观、易懂、易学、可读性好。

• 计算机不能直接识别和执行。(需要进行编译)

• 发展很快。

Page 6: 第四章 汇编语言程序设计

6

4.1.2 编制程序的步骤

1. 任务分析(硬件、软件系统分析)2. 确定算法和工作步骤;3. 程序总体设计和流程图绘制

关于流程图符号:开始、结束 ---- 圆角矩形工作任务 ---- 矩形判断分支 ---- 菱形程序流向 ----

程序连接 ----

开始 结束

Page 7: 第四章 汇编语言程序设计

7

4. 分配内存,确定程序与数据区存放地址;5. 编写源程序;6. 调试、修改,最终确定程序。

4.1.2 编制程序的步骤

Page 8: 第四章 汇编语言程序设计

8

4.1.3 方法技巧

1. 模块化设计(按功能分:显示、打印、输

入、发送等)

2. 尽量采用循环及子程序结构(节省内存)

Page 9: 第四章 汇编语言程序设计

9

4.1.4 汇编语言的规范

• 汇编语言源程序由以下两种指令构成:汇编语句(指令语句)伪指令(指示性语句)

• 汇编语句的格式: 标号: 操作码 操作数 ;注释

• 数据表示形式: 二进制( B )、十六进制 (H) 、十进制 (D 或省略 ) 、

ASCII 码(以单引号标识)

Page 10: 第四章 汇编语言程序设计

10

控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。

通过使用伪指令向汇编程序发出指示信息,告诉它如何完成汇编工作。

伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。

伪指令

Page 11: 第四章 汇编语言程序设计

11

常用的伪指令

ORG (Origin) 定位目的程序的起始地址。 格式: ORG 表达式 如: ORG 0000H

• 注:表达式必须为 16位地址值。

END

汇编语言程序结束伪指令。 注:一定放在程序末尾!

Page 12: 第四章 汇编语言程序设计

12

EQU (EQUate) 赋值伪指令。

格式: 字符名称 EQU 数值或汇编符号 例: AA EQU 30H

K1 EQU 40HMOV A , AA ; (30H )→ AMOV A , K1 ;( 40H )→ A

常用的伪指令

Page 13: 第四章 汇编语言程序设计

13

DB ( Define Byte ) 从指定单元开始定义(存储)若干个字节的数据

或 ASCII 码字符,常用于定义数据常数表。

格式: DB 字节常数或 ASCII 字符

例 : ORG 1000HDB 34H , 0DEH “, A” “, B”DB 0AH , 0BH , 20

常用的伪指令

Page 14: 第四章 汇编语言程序设计

14

常用的伪指令

DW ( Define Word ) 从指定单元开始定义(存储)若干个字的数据 或 ASCII 码字符。 格式: DW 字常数或 ASCII 字符 例: ORG 2000H

DW 1234H “, B”DW 0AH , 20

思考 : (2000H) 及其以后的地址单元中的内容是多少?

Page 15: 第四章 汇编语言程序设计

15

常用的伪指令

BIT

位地址符号指令。 把位地址赋于规定的字符名称。

格式:字符名称 BIT 位地址

例: ABC BIT P1.1

QQ BIT P3.2

Page 16: 第四章 汇编语言程序设计

16

§ 4.2 汇编语言程序编辑和汇编

1. 编辑(源程序,以 .ASM扩展名存盘);2. 汇编(手工或机器汇编);如: MOV A,#88H; 机器码 74 88 又如: 地址 目标码 源程序 ORG 1000H 1000H 74 7F MOV A,#7FH 1002H 79 44 MOV R1,#44H END

Page 17: 第四章 汇编语言程序设计

17

§ 4.3 程序设计基础与举例

4.3.1 顺序结构程序org 1000hstart:mov dptr,#2000h mov a,20h movc a,@a+dptr mov 21h,a sjmp $org 2000htable:db 0,1,4,9,16,25 end

例 1 :变量存在内部RAM 的20H 单元中,其取值范围:0~5 ,编成,查表法求其平方值

Page 18: 第四章 汇编语言程序设计

18

开始

表格首地址送 DPTR

变量送 A ( 20H ) A

查平方表 (A+DPTR) A

结束

结果送 21H 单元 :A 21H

Page 19: 第四章 汇编语言程序设计

19

例 2 :将 20H 单元的压缩( Packed ) BCD 码拆成两个 ACSII 码存入21H 、 22H 单元。

内部 RAM

22H

21H

20H 6 9

3 63 9BC

D 0 1 2... 9

ASCII 30H 31H 32H ... 39H

Page 20: 第四章 汇编语言程序设计

20

方法 1(20H)A

10HB

A/B,A 中为高 4 位 BCD 码,B 中为低 4 位 BCD 码

B+30HB

B(21H)

A+30HA

A(22H)

开始

结束

Page 21: 第四章 汇编语言程序设计

21

周期数 源程序

ORG 2000HMOV A , 20HMOV B , #10HDIV ABORL B , #30HMOV 21H , BORL A , #30HMOV 22H , AEND

1242211

13

;除以 10H;高 4 位 BCD 码转换位ASCII 码

;低 4 位 BCD 码转换位ASCII 码

Page 22: 第四章 汇编语言程序设计

22

0 (21H)

(20H)A

A 与 (21H) 的低 4 位交换

(21H)+30H(21H)

A 的高低半字节交换

A+30HA

A(22H)

开始

结束

方法 2 :

Page 23: 第四章 汇编语言程序设计

23

ORG 2000H MOV R0 , #21H MOV @R0 , #0 MOV A , 20H XCHD A , @R0 ORL 21H , #30H SWAP A ORL A , #30H MOV 22H , A END

;清 21H 单元

;低 4 位 BCD 码送 21H 单元,;低 4 位 BCD 码转换位ASCII 码

;高 4 位 BCD 码转换位ASCII 码

111121119

周期数 源程序

Page 24: 第四章 汇编语言程序设计

24

4.3.2 分支程序

分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)

条件成立?

下条指令

程序段 A

单分支结构

Y

N

条件成立?

程序段 A

YN

程序段 A

双分支结构

Page 25: 第四章 汇编语言程序设计

25

4.3.2 分支程序

分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)

K= ?

程序段 n

n

0

程序段 1

多分支结构

程序段 0

1

Page 26: 第四章 汇编语言程序设计

26

例 1 :设变量 x 以补码形式存放在片内 RAM 30H 单元中,变量 y 与 x 的关系是:

编程根据 x 的值求 y 值并放回原单元。

0,5

0,20

0,

xx

xH

xx

y

Page 27: 第四章 汇编语言程序设计

27

A=?

y=x+5

<0>0

y=20Hy=x0

取 x 即( 30h ) A

开始

存 y 即 y 20h

结束

Page 28: 第四章 汇编语言程序设计

28

ORG 1000HSTART: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 $

Page 29: 第四章 汇编语言程序设计

29

START : MOV DPTR , #TAB MOV A , R7 ADD A,R7 ; R7×2A MOV R3,A ; 暂存 R3 MOVC A,@A+DPTR ;取高位地址 XCH A , R3 INC A MOVC A , @A+DPTR ;取低位地址 MOV DPL , A MOV DPH , R3 ;转移地址送入 DPTR CLR A JMP @A+DPTR TAB: DW P0 DW P1 …

DW PN

例 2 :根据 R7 的内容,转至对应的分支程序。设 R7的内容为 0~N ,对应的处理程序地址分别为 P0~P7

P0 高位P0 低位

TAB

P1 高位P1 低位

TAB+2

Page 30: 第四章 汇编语言程序设计

30

4.3.3 循环程序

循环程序一般由: 初始化部分 循环体部分 -- 处理部分、修改部分、控制部分 结束部分

其结构一般有两种: 先进入处理部分,再控制循环

• 至少执行一次循环体 先控制循环,再进入处理部分

• 循环体是否执行,取决于判断结果。

Page 31: 第四章 汇编语言程序设计

31

开始

设置循环初值

循环处理

循环修改

结束处理

结束

循环结束?

开始

设置循环初值

循环处理

循环修改

结束处理

结束

循环结束?

N

Y

Y

N

Page 32: 第四章 汇编语言程序设计

32

循环控制的一般方法:

循环次数已知 利用循环次数控制

循环次数未知 利用关键字控制

利用“逻辑尺” 根据“逻辑尺”的内容,进行控制。

Page 33: 第四章 汇编语言程序设计

33

例 4-3-6 : 50ms 延时子程序。设晶振频率为12MHz ,则机器周期为 1us 。

DEL: MOV R7,#200 ;1MCDEL1:MOV R6,#123 ;1MC NOP ;1MC DJNZ R6,$ ;2MC DJNZ R7,DEL1 ;2MC RET ;2MC

延时时间: t=1+200[(1+1+2*123)+2]+2 ≈50000us=50ms

Page 34: 第四章 汇编语言程序设计

34

例 4-3-8 :将内部 RAM 中起始地址为 data 的数据串串送到外部 RAM 中起始地址为 buffer 的存储区域中,直到发现‘ $’ 字符,传送停止 ---- 循环次数事先不知道先判断,后执行。 MOV R0,#data MOV DPTR,#bufferLOOP1:MOV A,@R0 CJNE A,#24H,LOOP2 ; 判断是否为$字符 SJMP LOOP3 ; 是,转结束LOOP2:MOVX @DPTR,A ; 不是,传送数据 INC R0 INC DPTR SJMP LOOP1 ;传送下一数据LOOP3:END

Page 35: 第四章 汇编语言程序设计

35

4.3.4 子程序问题

子程序设计时注意事项:1. 给子程序赋一个名字。实际为入口地址代号。2. 要能正确传递参数:

入口条件:子程序中要处理的数据如何给予。 出口条件:子程序处理结果如何存放。

(寄存器、存储器、堆栈方式)3. 保护与恢复现场:

保护现场:压栈指令 PUSH 恢复现场:弹出指令 POP

4. 子程序可以嵌套

Page 36: 第四章 汇编语言程序设计

36

例 4-3-9 :利用查表法求平方和 ,设 a 、 b 、 c 分别存于内部 RAM 的 DA 、 DB 、 DC 三个单元中。

MOV A,DA ; 取 a ACALL SQR ; 调用查表子程序 MOV R1,A ;a 的平方暂存 R1 中 MOV A,DB ; 取 b ACALL SQR ; 调用查表子程序 ADD A,R1 ; 求出平方和暂存阿 A 中 MOV DC,A ; 结果存于 DC 中 SJMP $SQR:MOV DPTR,#TAB ; 子程序 MOVC A,@A+DPTR RETTAB: DB 0,1,4,9,16,25,36,49,64,81 END

22 bac

利用累加器或寄存器传递参数

Page 37: 第四章 汇编语言程序设计

37

4.3.5 码型转换程序的设计

一、十六进制数与 ASCCII 码之间的转换 (对比 BCD 与 ASCCI 之间的转换— 4.3.1 中例 2 )

表 4-1 十六进制数与 ASCII 码之间的关系

十 六进制数

十 六进制数

十 六进制数

十 六进制数

0 30H 4 34H 8 38H C 43H

1 31H 5 35H 9 39H D 44H

2 32H 6 36H A 41H E 45H

3 33H 7 37H B 42H F 46H

Page 38: 第四章 汇编语言程序设计

38

例 4-3-15 将一位十六进制数转换成 ASCII 码,设十六进制数存放在 R0 中,转换后的 ASCII 码放在R2 中。HTASC: MOV A, R0 ; 取十六进制数 PUSH ACC ; 保护 CLR C ; SUBB A,#0AH ; 判断是否大于十 POP ACC ; JC LOOP ; 小于十,直接加 30H ADD A,#07H ; 大于十,加 37H LOOP:ADD A,#30H MOV R2,A RET

Page 39: 第四章 汇编语言程序设计

39

例 4-3-16 将多位十六进制数转换成 ASCII 码,设 R0 指向十六进制数低位, R2 存放字节数,转换后 R1 指向 ASCII码高位。HTASC: MOV A,@R0 ; 取十六进制数 ANL A,#0FH ; 取低四位 ADD A,#15 ; 偏移修正 MOVC A,@A+PC ; 查表得 ASCII 码 MOV @R1,A ; 保存 INC R1 MOV A,@R0 ; 取十六进制数高四位 SWAP A ; ANL A,#0F0H ADD A,#06H ; 偏移修正 MOVC A,@A+PC ; 查表 MOV @R1,A ; 保存 INC R0 ; 指向下一单元 INC R1 DJNZ R2,HTASC RETASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H

Page 40: 第四章 汇编语言程序设计

40

二、 BCD 码与二进制数之间的转换 (对比 BCD 与 ASCCI 之间的转换— 4.3.1 中例 2 )

例 4-3-17 :双字节数 R2R3 转换成压缩 BCD 码存在

R4R5R6 中。由十进制数与二进制数之间的关系可知:十进制数 D 与 n 位二进制数的关系克表示为

D=bn-1×2n-1+bn-2×2n-2+...+b1×2+b0

={...{[(bn-1×2+bn-2)×2]+bn-3}...+b1}×2+b0

部分和存在 R4R5R6 中,其中 bi 每次移入 Cy

Page 41: 第四章 汇编语言程序设计

41

DCDTH: CLR A ; MOV R4,A ;R4 清零 MOV R5,A ;R4 清零 MOV R6,A ;R6 清零 MOV R7,#16 ; 循环初值LOOP: CLR C MOV A, R3 ; R2R3 左移一位,并送回 RLC A ; (即将 bi 每次移入 Cy 中) MOV R3,A ; MOV A,R2 ; RLC A ; MOV R2,A ; MOV A,R6 ; R4R5R6×2+ bi 并调整送回 ADDC A,R6 DA A ; MOV A,R5 ; ADDC A,R5 ; DA A ;

Page 42: 第四章 汇编语言程序设计

42

MOV A,R4 ; ADDC A,R4 DA A ; MOV R4 , A ; DJNZ R7,LOOP ; END