第章C的汇编语言程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

起始地址设定伪指令ORG
ORG 表达式
ORG 8000H
表达式通常为十六进制地址,例: START:MOV A,#30H
ORG可多次使用,但地址值的顺序要由小到大… …
结束汇编伪指令END
END
该伪指令位于源程序的最后一行。
6/7/2020
13
定义字节数据表伪指令DB
[标号:] DB 字节数据表
如: ORG 1000H DB -2,-4,-6,8,10,18
对中断子程序还有注意保护PSW的内容
6/7/2020
5
4.1.3 汇编语言的语句格式
Keil的汇编器A51可以识别的语句形式为:
[标号:] 指令助记符 [操作数1,] [操作数2,] [操作数3,] [;注释]
标号(即符号地址)
非数字字符开头,后跟字母、数字、“-”、“?” 等
不能用已定义的保留字(指令助记符、伪指令等)
3
流程描述
流程图符号
开始或结束符号
判断分支符号
工作任务符号
程序连接符号
程序流向符号
程序流向符号
“超级循环”框架
开始 初始化
循环扫描、处理
6/7/2020
4
4.1.2 程序编制的方法和技巧
强化模块观念
程序模块(主程序模块、各种子程序模块) 模块化优点:分块设计、便于阅读、调试方便
采用循环和子程序
使程序占用空间减少、结构清晰 循环初值和结束条件,避免“死机”现象 子程序的现场保护(注意栈平衡、寄存器内容)
开始
置初值 Y
循环结束? N 循环处理 循环修改
结束处理
结束
MAIN:MOV MOV
LOOP0:MOV CJNE SJMP
LOOP1:MOVX INC INC SJMP
DONE:SJMP
R0,#60H
;置初值
DPTR,#1000H
A,@R0
;取数据
A,#24H,LOOP1 ;循环结束?
DONE
;是
@DPTR,A
X=0 分支程序PP0
X=1 分ቤተ መጻሕፍቲ ባይዱ程序PP1
X=2 分支程序PP2
X=3
X=4
分支程序PP3 分支程序PP4
返回
6/7/2020
19
【例4-3】根据R7的内容x(转移序号)转向相应的处理程序。
设R7内容为0~4,对应的处理程序入口地址分别为PP0~PP4。
JPNUM:MOV DPTR,#TAB
START:MOV R7,#3
PP0:….. RET
PP1:…… RET
PP2:….. RET
PP3: ……
DW PP1
RET
………
PP4:……
DW PPN
RET
6/7/2020
20
JPNUM:MOV DPTR,#TAB MOV A,R7 ADD A,R7 JNC NOAD INC DPH
NOAD: JMP @A+DPTR TAB: AJMP PP0
定义字数据表伪指令DW
[标号:] DW 字数据表
ORG 1400H DATA1:DW 324AH,3CH
……
6/7/2020
14
1000H FEH 1001H FCH
FAH 08H 0AH 12H
1400H 32H 1401H 4AH 1402H 00H 1403H 3CH
大端模式
定义常值为符号名伪指令EQU
6/7/2020
10
4.2.1 源程序的编辑和汇编
源程序的编辑
依据汇编语言规则 用好伪指令 符号不用中文 SJMP $ 用于调试 以 .ASM存盘
ORG 0000H LJMP MAIN ORG 0003H LJMP INT0 ORG 0030H MAIN:MOV SP,#60H Mlop:……. SJMP MLOP INT0:……..;中断服务程序 RETI
RET
;2μs
P110有其他的延时子程序
6/7/2020
24
4.4 子程序及其调用
完成通用功能、反复使用的程序设计成子程序。使应用 程序结构清晰紧凑,便于阅读和调试
执行要由其它程序来调用,执行完后要返回到调用程序
结构上仍然采用一般程序的3种结构
调用时注意: 一是现场的保护和恢复; 二是主程序与子程序间的参数传递。
6/7/2020
25
4.4.1 现场保护与恢复
在主程序中实现(结构灵活)
PUSH 号)
PUSH PUSH MOV LCALL POP POP POP
PSW
;保护现场( 含当前工作寄存器组
ACC
;
B
;
PSW,#10H ;切换当前工作寄存器组
addr16 ;子程序调用,
B
;恢复现场
ACC
;
PSW
;含当前工作寄存器组切换
第4章 80C51的汇编语言程序设计
4.1 程序编制的方法和技巧 4.2 源程序的编辑和汇编 4.3 基本程序结构 4.4 子程序及其调用 4.5 简单I/O设备的并口直接驱动示例
6/7/2020
1
单片机应用系统由硬件系统和应用程序构成
应用程序设计方法
汇编语言 高级语言
汇编语言,生成的目标程序占内存空间少、运行速 度快,具有效率高、实时性强。
20H送Y
NEXT:MOV 30H,#20H ;x = 0,20H送Y 结束
DONE:SJMP DONE
END 6/7/2020
18
【例4-3】根据R7的内容x(转移序号)转向相应的处理程序。 设R7内容为0~4,对应的处理程序入口地址分别为PP0~PP4。
取分支号,乘2
地址高、低字节存DPTR
X=?
Y 结束处理
结束
MAIN:MOV MOV MOV
LOOP:MOV INC DJNZ SJMP
R0,#30H ;置初值
A,#00H ;
R7,#16 ;
@R0,A ;循环处理
R0
;
R7,LOOP ;循环修改,判结束
$
;结束处理
6/7/2020
22
【例4-5】将内部RAM起始地址为60H的数据串传送到外部RAM中 起始地址为1000H的存储区域,直到发现‘$ ’字符停止传送。
高级语言,对系统的功能描述与实现简单,程序阅 读、修改和移植方便,适合于编写复杂的程序。
6/7/2020
2
4.1 程序编制的方法和技巧
4.1.1 程序编制的步骤 任务分析
明确任务:功能要求、技术指标 运行环境调研
算法设计
将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求与运行速度)
6/7/2020
0040H A,21H A,#0FH A 20H,A A,22H A,#0FH 20H,A $
;取十位ASCII码 ;保留低半字节 ;移至高半字节 ;存于20H单元 ;取个位ASCII码 ;保留低半字节 ;合并到结果单元
17
取十位的ASCII码 保留低半字节
移至高半字节,存回 取个位的ASCII码 保留低半字节 合并到结果单元 结束
6/7/2020
7
表4.1
优先级
运算符
功能
表达式及其结果示例
()
括号
4*(5+6)即44
NOT、HIGH、 取反、取高字节、取低 NOT 55H 即AAH;
LOW
字节
HIGH 1234H 即12H
高 ↓
+、-
正号、负号
+5、-6
↓ ↓
*、/、MOD
乘、除(取商)、取余 数
17 / 5 即3; 17 MOD 5 即2
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 START:MOV
JZ ANL JZ MOV ADD MOV SJMP
6/7/2020
8
4.2 源程序的编辑和汇编
目标程序的产生过程如下图:
汇编源文件 .ASM
汇编器 A51.EXE
目标文件 (浮动地址)
.OBJ
.LST
编译器 C51.EXE
C源文件
.LST
.C
库文件 .LIB
调试目标文件 (绝对地址) 无扩展名
可烧写 目标文件
.HEX
连接器 BL51.EXE
转换器 OH51.EXE
SUBP1:…… ;子程序 ret END
6/7/2020
11
评价程序质量的标准:
① 程序的执行时间 ② 程序所占用的内存字节数目 ③ 程序的逻辑性、可读性 ④ 程序的兼容性、可扩展性 ⑤ 程序的可靠性
时 间概 空 间念
6/7/2020
12
回目录 上页 下页
4.2.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
6/7/2020
15
定义位地址为符号名伪指令BIT
符号名 BIT 位地址表达式 如: ST BIT P1.0 ;将P1.0的位地址赋给符号名ST CF BIT 0D7H ;将位地址为D7H的位定义为符号名
用BIT定义的“符号名”一经定义便不能重 新定义和改变
其它一些伪指令参见教材表4.2
6/7/2020
0040H A,30H NEXT A,#80H DONE A,#05H A,30H 30H,A DONE
开始
;取x至累加器 ;x = 0,转NEXT
取x至累加器
J;N否B,保AC留C符.7号,位DONE X=0? Y
;x >0,转结束
N
;AxDD<0处A理,#5
Y X>0?
N
;X+05H送Y
X+05H送Y
;
MOV A,R7
以转移序号3为例
ADD A,R7
ACALL JPNUM
MOV R3,A MOVC A,@A+DPTR
AJMP START
XCH A,R3
INC A MOVC A,@A+DPTR PMUOSVH DAPCLC,A MMOOVV DAP,RH3,R3
PCULSRH AACC RJMETP @A+DPTR TAB:DW PP0
.M51
映像文件
仿真调试
写入芯片
6/7/2020
9
源程序的汇编
汇编源程序转为目标程序的过程叫汇编 汇编通常在Windows下的集成开发环境完成 用A51.EXE汇编生成.OBJ、.LIB及.LST
目标程序的连接
.OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目标文件 绝对地址目标文件可以用于仿真器调试 调试无误的目标文件用OH51.EXE转换为.HEX文件 .HEX文件经编程器写入单片机存储器
;循环处理
R0
;循环修改
DPTR
LOOP0
;继续循环
DONE
;结束处理
6/7/2020
23
例:50ms延时程序。fosc=12MHz.Tc=1μs
DEL:MOV R7,#200 ;1μs
DEL1:MOV R6,#123 ;1μs
NOP
;1μs
DEL2:DJNZ R6,DEL2 ;2μ ((24×6μ12s3+)1+=12+426)μ×s200+1+2=500003μs DJNZ R7,DEL1 s;1μs


+、-
加、减
5+4 即 9; 5-4 =即1
↓ ↓
SHL、SHR
左移、右移
2 SHL 2即8;8 SHR 2 即 2
低· AND、OR、XOR
与、或、异或
45H AND 0FH即05H
<、>、=、<>、 <=、>=
比较运算符
MOV A,X>8; 若X>8为真,则为MOV A,01H 若X>8为假,则为MOV A,00H
指后令跟助英文记冒符号“:”
是指令功能的英文缩写。
6/7/2020
6
操作数
数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意A~F开头时要加“0” ASCII码,如 ‘A’,‘1245’
❖ 符号:符号名、标号或“$”(PC的当前值) ❖ 表达式:由运算符和数据构成(见表4.1)
注释
英文分号“;”开头
符号名 EQU 常值表达式
符号名为: ❖地址 ❖常数 ❖段名 ❖字符串 ❖寄存器名 ❖位名
比较:标号只能是地址
LEN EQU SUM EQU BLOCK EQU
CLR MOV MOV LOOP:ADD INC DJNZ MOV
10 21H 22H A R7,#LEN R0,#BLOCK A,@R0 R0 R7,LOOP SUM,A
AJMP PP1
…… AJMP PPN
PP0:….. RET
PP1:…… RET
PP2:….. RET
PP3: …… RET
PPN:…… RET
6/7/2020
21
4.3.3 循环程序 (2种:先执行,后判断;先判断,后执行)
【例4-4】将内部RAM的30H至3FH单元初始化为00H。
开始
置初值
循环处理 循环修改 N 循环结束?
6/7/2020
26
在子程序中实现(程序规范、清晰)
SUB1:PUSH PSW ;保护现场( 含当前工作寄存器组号)
PUSH ACC
;
PUSH B
;
MOV PSW,#10H ;切换当前工作寄存器组
…… POP B
;恢复现场
POP ACC
;
16
4.3 基本程序结构
4.3.1 顺序程序 (无分支、无循环)
【例4-1】片内RAM的21H单元存放一个十进制数据十位的ASCII码,
22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压
缩BCD码存放在20H单元。
开始
ORG START:MOV
ANL SWAP MOV MOV ANL ORL SJMP END 6/7/2020
相关文档
最新文档