- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ACC ; B ; PSW,#10H ;切换当前工作寄存器组
B ACC PSW
;恢复现场 ; ;内含当前工作寄存器组切换
2016/10/18
32
4.4.2 参数传递
利用累加器或寄存器(简单、快速,但参数个数不多) 【例4-6】实现两个8位的十六进制无符号数求和的子程序。
以 .ASM存盘
0000H MAIN 0040H R7,#16 R0,#60H A,#55H @R0,A R0 R7,LOOP $
2016/10/18
源程序的汇编
汇编源程序转为目标程序的过程叫汇编 汇编通常在Windows下的集成开发环境完成 用A51.EXE汇编生成.OBJ、.LIB及.LST
目标程序的连接
5
2016/10/18
4.1.3 汇编语言的语句格式
Keil的汇编器A51可以识别的语句形式为:
[标号:] 指令助记符 [操作数1,] [操作数2,] [操作数3,] [;注释]
标号(即符号地址)
非数字字符开头,后跟字母、数字、“ -” 、“?” 等 不能用已定义的保留字(指令助记符、伪指令等) 后跟英文冒号“:”
汇编语言编程总结
特点: 操作对象(变量)——全局变量 功能有限 优势:代码高效冗余少,运行速度快,实时性高, 适合短小高速的程序。 劣势:编程难度大,不便于阅读、修改、移植
4.4.1 现场保护与恢复 在主程序中实现(结构灵活)
PUSH 号) PUSH PUSH MOV LCALL POP POP POP PSW
7
2016/10/18
表4.1
优先级
运 算 符
功
能
表达式及其结果示例 4*(5+6)即44 NOT 55H 即AAH; HIGH 1234H 即12H +5、-6 17 / 5 即3; 17 MOD 5 即2
() NOT、HIGH、 LOW
高 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 低·
括号 取反、取高字节、取低 字节 正号、负号 乘、除(取商)、取余 数
ACC B PSW,#10H addr16 B ACC PSW
;保护现场( 含当前工作寄存器组
; ; ;切换当前工作寄存器组 ;子程序调用, ;恢复现场 ; ;含当前工作寄存器组切换
2016/10/18
31
在子程序中实现(程序规范、清晰)
SUB1:PUSH 号) PUSH PUSH MOV … … POP POP POP RET PSW ;保护现场( 含当前工作寄存器组
1000H 1001H
FEH
FCH
FAH 08H
如: ORG 1000H DB -2,-4,-6,8,10,18
0AH
12H
定义字数据表伪指令DW
[标号:] DW 字数据表 ORG 1400H DATA1:DW 324AH,3CH … …
2016/10/18 13
1400H 1401H 1402H 1403H
.OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目标文件 绝对地址目标文件可以用于仿真器调试 调试无误的目标文件用OH51.EXE转换为.HEX文件 .HEX文件经编程器写入单片机存储器
11
2016/10/18
4.2.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
查表程序 延时程序
p112 p116
练习:
编写程序,控制p1.0连接的发光二极管实现 0.5s的闪亮,系统晶振为6MHz。 要求,至少两个函数的设计 主函数 延时子函数
练习:
编写程序,控制p2连接的数码管,实现0.5s的 切换数值从0-9循环显示,系统晶振为6MHz。 要求,至少三个函数的设计 主函数 延时子函数 查表子函数(获取数值x[0,9]的段码)
指令助记符
是指令功能的英文缩写。
6
2016/10/18
操作数
数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意A~F开头时要加“0” ASCII码,如 „A‟,‘1245‟ 符号:符号名、标号或“$”(PC的当前值) 表达式:由运算符和数据构成(见表4.1)
注释
英文分号“;”开头
取十位的ASCII码 保留低半字节 移至高半字节,存回 取个位的ASCII码 保留低半字节 合并到结果单元 结束
压缩BCD码存放在20H单元。
2016/10/18
16
4.3.2 分支程序
(单分支、双分支、多分支)
开始
【例4-2】设变量x以补码 的形式存放在片内RAM的 30H单元,变量y与x的关 系是:当x大于0时,y=x;当 x=0时,y=20H;当x小于0 时,y=x+5。编制程序,根 据x的大小求y并送回原单 元。
起始地址设定伪指令ORG
ORG 8000H 表达式通常为十六进制地址,例: START:MOV A,#30H ORG可多次使用,但地址值的顺序要由小到大 … … ORG 表达式
结束汇编伪指令END END
该伪指令位于源程序的最后一行。
2016/10/18 12
定义字节数据表伪指令DB
[标号:] DB 字节数据表
第4章 80C51的汇编语言程序设计
4.1 4.2 4.3 4.4 4.5 程序编制的方法和技巧 源程序的编辑和汇编 基本程序结构 子程序及其调用
简单I/O设备的并口直接驱动示例
2016/10/18
1
单片机应用系统由硬件系统和应用程序构成 应用程序设计方法
汇编语言 高级语言 汇编语言,生成的目标程序占内存空间少、运行速 度快,具有效率高、实时性强。 高级语言,对系统的功能描述与实现简单,程序阅 读、修改和移植方便,适合于编写复杂的程序。
32H
4AH
00H 3CH
大端模式
定义常值为符号名伪指令EQU
符号名 EQU 常值表达式 LEN EQU SUM EQU BLOCK EQU CLR MOV MOV LOOP:ADD INC DJNZ MOV
14
符号名为: 地址 常数 段名 字符串 寄存器名 位名 比较:标号只能是地址
R0,#60H DPTR,#1000H A,@R0 A,#24H,LOOP1 DONE @DPTR,A R0 DPTR LOOP0 DONE
;置初值
; 取数据 ;循环结束? ;是 ;循环处理 ;循环修改
;继续循环 ;结束处理
结束
2016/10/18
24
4.4 子程序及其调用
完成通用功能、反复使用的程序设计成子程序。使应用 程序结构清晰紧凑,便于阅读和调试 执行要由其它程序来调用,执行完后要返回到调用程序 结构上仍然采用一般程序的3种结构 调用时注意: 一是现场的保护和恢复; 二是主程序与子程序间的参数传递。
;以转移序号3为例
;置分支入口地址表首址 ;乘2,调整偏移量
; 取地址高字节,暂存于R3
;取地址低字节 ;处理程序入口地址低8位送DPL ;处理程序入口地址高8位送DPH
21
TAB:DW DW DW DW DW PP0:MOV RET PP1:MOV RET PP2:MOV RET PP3:MOV RET PP4:MOV RET
X=1 分支程序PP1
X=2 分支程序PP2
X=3 分支程序PP3
X=4 分支程序PP4
返回
2016/10/18
20
START:MOV ACALL AJMP JPNUM:MOV MOV ADD MOV MOVC XCH INC MOVC MOV MOV CLR JMP
2016/10/18
R7,#3 JPNUM START DPTR,#TAB A,R7 A,R7 R3,A A,@A+DPTR A,R3 A A,@A+DPTR DPL,A DPH,R3 A @A+DPTR
2016/10/18
10 21H 22H A R7,#LEN R0,#BLOCK A,@R0 R0 R7,LOOP SUM,A
定义位地址为符号名伪指令BIT
符号名 BIT 位地址表达式 P1.0 0D7H ;将P1.0的位地址赋给符号名ST ;将位地址为D7H的位定义为符号名 如: ST BIT CF BIT
写入芯片 仿真调试
C源文件 .C
.LST
库文件 .LIB
映像文件
2016/10/18
9
4.2.1 源程序的编辑和汇编
源程序的编辑
依据汇编语言规则 用好伪指令 ORG LJMP ORG MAIN:MOV MOV MOV LOOP:MOV INC DJNZ SJMP END
P0 PP1 PP2 PP3 PP4 30H,#0
30H,#1 30H,#2 30H,#3 30H,#4
;转移序号为0时,置功能号“0”于30H单元 ;转移序号为1时,置功能号“1”于30H单元 ;转移序号为2时,置功能号“2”于30H单元 ;转移序号为3时,置功能号“3”于30H单元 ;转移序号为4时,置功能号“4”于30H单元
2016/10/18
22
4.3.3 循环程序
(2种:先执行,后判断;先判断,后执行)
【例4-4】将内部RAM的30H至3FH单元初始化为00H。
开始
置初值
循环处理 循环修改 N
循环结束? Y 结束处理
MAIN:MOV MOV MOV LOOP:MOV INC DJNZ SJMP
R0,#30H A,#00H R7,#16 @R0,A R0 R7,LOOP $
2016/10/18
8
4.2 源程序的编辑和汇编
目标程序的产生过程如下图:
汇编源文件 .ASM
汇编器 A51.EXE
目标文件 (浮动地址) .OBJ