View
95
Download
5
Category
Preview:
DESCRIPTION
第四章 汇编语言程序设计. 通过前面的学习,我们已经了解了单片机内部的结构, MCS-51 指令系统的寻址方式、各类指令的格式及功能。 下面我们就是要如何利用 MCS-51 的指令系统,来编写高效、充分利用其特点的程序。. § 4.1 概述. 4.1.1 程序设计语言. 目前,用于程序设计的语言基本上分为三种:. 1. 机器语言 在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。 缺点:程序不易看懂,不便于记忆,容易出错。. 程序设计语言. 2. 汇编语言 - PowerPoint PPT Presentation
Citation preview
2
第四章 汇编语言程序设计
通过前面的学习,我们已经了解了单片机内部的结构, MCS-51 指令系统的寻址方式、各类指令的格式及功能。
下面我们就是要如何利用 MCS-51 的指令系统,来编写高效、充分利用其特点的程序。
3
§ 4.1 概述4.1.1 程序设计语言
1. 机器语言
在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。
缺点:程序不易看懂,不便于记忆,容易出错。
目前,用于程序设计的语言基本上分为三种:
4
2. 汇编语言
用助记符表示的指令称为符号语言或汇编语言。
汇编语言程序 ( 源程序 ) 需要“汇编” ( 由专门的汇编程序完成 ) 才能转换成机器语言。得到的机器语言程序称为目标程序。
特点:
• 是面向机器的语言,必须对硬件有一定的了解。
• 助记符指令和机器指令一一对应。
• 能直接管理和控制硬件设备(功能部件)。
程序设计语言
5
3. 高级语言
高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。
常用的高级语言,如 BASIC 、 FORTRAN 、 C 语言等。
特点:
• 通用性强,直观、易懂、易学、可读性好。
• 计算机不能直接识别和执行。(需要进行编译)
• 发展很快。
6
4.1.2 编制程序的步骤
1. 任务分析(硬件、软件系统分析)2. 确定算法和工作步骤;3. 程序总体设计和流程图绘制
关于流程图符号:开始、结束 ---- 圆角矩形工作任务 ---- 矩形判断分支 ---- 菱形程序流向 ----
程序连接 ----
开始 结束
7
4. 分配内存,确定程序与数据区存放地址;5. 编写源程序;6. 调试、修改,最终确定程序。
4.1.2 编制程序的步骤
8
4.1.3 方法技巧
1. 模块化设计(按功能分:显示、打印、输
入、发送等)
2. 尽量采用循环及子程序结构(节省内存)
9
4.1.4 汇编语言的规范
• 汇编语言源程序由以下两种指令构成:汇编语句(指令语句)伪指令(指示性语句)
• 汇编语句的格式: 标号: 操作码 操作数 ;注释
• 数据表示形式: 二进制( B )、十六进制 (H) 、十进制 (D 或省略 ) 、
ASCII 码(以单引号标识)
10
控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。
通过使用伪指令向汇编程序发出指示信息,告诉它如何完成汇编工作。
伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。
伪指令
11
常用的伪指令
ORG (Origin) 定位目的程序的起始地址。 格式: ORG 表达式 如: ORG 0000H
• 注:表达式必须为 16位地址值。
END
汇编语言程序结束伪指令。 注:一定放在程序末尾!
12
EQU (EQUate) 赋值伪指令。
格式: 字符名称 EQU 数值或汇编符号 例: AA EQU 30H
K1 EQU 40HMOV A , AA ; (30H )→ AMOV A , K1 ;( 40H )→ A
常用的伪指令
13
DB ( Define Byte ) 从指定单元开始定义(存储)若干个字节的数据
或 ASCII 码字符,常用于定义数据常数表。
格式: DB 字节常数或 ASCII 字符
例 : ORG 1000HDB 34H , 0DEH “, A” “, B”DB 0AH , 0BH , 20
常用的伪指令
14
常用的伪指令
DW ( Define Word ) 从指定单元开始定义(存储)若干个字的数据 或 ASCII 码字符。 格式: DW 字常数或 ASCII 字符 例: ORG 2000H
DW 1234H “, B”DW 0AH , 20
思考 : (2000H) 及其以后的地址单元中的内容是多少?
15
常用的伪指令
BIT
位地址符号指令。 把位地址赋于规定的字符名称。
格式:字符名称 BIT 位地址
例: ABC BIT P1.1
QQ BIT P3.2
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
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 ,编成,查表法求其平方值
18
开始
表格首地址送 DPTR
变量送 A ( 20H ) A
查平方表 (A+DPTR) A
结束
结果送 21H 单元 :A 21H
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
20
方法 1(20H)A
10HB
A/B,A 中为高 4 位 BCD 码,B 中为低 4 位 BCD 码
B+30HB
B(21H)
A+30HA
A(22H)
开始
结束
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 码
22
0 (21H)
(20H)A
A 与 (21H) 的低 4 位交换
(21H)+30H(21H)
A 的高低半字节交换
A+30HA
A(22H)
开始
结束
方法 2 :
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
周期数 源程序
24
4.3.2 分支程序
分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)
条件成立?
下条指令
程序段 A
单分支结构
Y
N
条件成立?
程序段 A
YN
程序段 A
双分支结构
25
4.3.2 分支程序
分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)
K= ?
程序段 n
n
0
程序段 1
多分支结构
程序段 0
1
26
例 1 :设变量 x 以补码形式存放在片内 RAM 30H 单元中,变量 y 与 x 的关系是:
编程根据 x 的值求 y 值并放回原单元。
0,5
0,20
0,
xx
xH
xx
y
27
A=?
y=x+5
<0>0
y=20Hy=x0
取 x 即( 30h ) A
开始
存 y 即 y 20h
结束
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 $
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
30
4.3.3 循环程序
循环程序一般由: 初始化部分 循环体部分 -- 处理部分、修改部分、控制部分 结束部分
其结构一般有两种: 先进入处理部分,再控制循环
• 至少执行一次循环体 先控制循环,再进入处理部分
• 循环体是否执行,取决于判断结果。
31
开始
设置循环初值
循环处理
循环修改
结束处理
结束
循环结束?
开始
设置循环初值
循环处理
循环修改
结束处理
结束
循环结束?
N
Y
Y
N
32
循环控制的一般方法:
循环次数已知 利用循环次数控制
循环次数未知 利用关键字控制
利用“逻辑尺” 根据“逻辑尺”的内容,进行控制。
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
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
35
4.3.4 子程序问题
子程序设计时注意事项:1. 给子程序赋一个名字。实际为入口地址代号。2. 要能正确传递参数:
入口条件:子程序中要处理的数据如何给予。 出口条件:子程序处理结果如何存放。
(寄存器、存储器、堆栈方式)3. 保护与恢复现场:
保护现场:压栈指令 PUSH 恢复现场:弹出指令 POP
4. 子程序可以嵌套
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
利用累加器或寄存器传递参数
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
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
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
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
中
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 ;
42
MOV A,R4 ; ADDC A,R4 DA A ; MOV R4 , A ; DJNZ R7,LOOP ; END
Recommended