80C51汇编语言
22
DW DW DW DW PP0:MOV 元
PP1 PP2 PP3 PP4 30H,#0
;转移序号为0时,置功能号“0”于30H单
RET PP1:MOV
元
30H,#
;转移序号为1时,置功能号“1”于30H单
RET PP2:MOV
元 RET PP3:MOV 元 RET PP4:MOV 元
2013-7-19
C源文件 .C
.LST
库文件 .LIB
映像文件
2013-7-19
9
4.2.1 源程序的编辑和汇编
源程序的编辑
依据汇编语言规则 用好伪指令 ORG LJMP ORG MAIN:MOV MOV MOV LOOP:MOV INC DJNZ SJMP END
10
符号不用中文
SJMP $ 用于调试
以 .ASM存盘
该伪指令位于源程序的最后一行。
2013-7-19 12
定义字节数据表伪指令DB
[标号:] DB 字节数据表
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 … …
+、- *、/、MOD
+、- SHL、SHR
AND、OR、XOR <、>、=、<>、 <=、>=
加、减 左移、右移
与、或、异或 比较运算符
5+4 即 9; 5-4 =即1 2 SHL 2即8;8 SHR 2 即 2
45H AND 0FH即05H
MOV A,X>8; 若X>8为真,则为MOV A,01H 若X>8为假,则为MOV A,00H
2013-7-19 20
;取x至累加器 ;x = 0,转NEXT ;否,保留符号位 ;x >0,转结束 ;x <0处理 ;X+05H送Y ;x = 0,20H送Y
【例4-3】根据R7的内容x(转移序号)转向相应的处理程序。 设R7内容为0~4,对应的处理程序入口地址分别为PP0~PP4。
取分支号,乘2
循环结束? Y 结束处理
MAIN:MOV MOV MOV LOOP:MOV INC DJNZ SJMP
R0,#30H A,#00H R7,#16 @R0,A R0 R7,LOOP $
;置初值 ; ; ;循环处理 ; ;循环修改,判结束 ;结束处理
结束
2013-7-19
24
【例4-5】将内部RAM起始地址为60H的数据串传送到外部RAM中 起始地址为1000H的存储区域,直到发现‘$ ‟字符停止传送。
2013-7-19 13
1400H 1401H 1402H 1403H
32H
4AH
00H 3CH
大端模式
定义常值为符号名伪指令EQU
符号名 EQU 常值表达式 LEN SUM BLOCK EQU EQU EQU CLR MOV MOV LOOP:ADD INC DJNZ MOV 10 21H 22H A R7,#LEN R0,#BLOCK A,@R0 R0 R7,LOOP SUM,A
指令助记符
是指令功能的英文缩写。
6
2013-7-19
操作数
数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意A~F开头时要加“0” ASCII码,如 „A‟,‘1245‟ 符号:符号名、标号或“$”(PC的当前值) 表达式:由运算符和数据构成(见表4.1)
注释
英文分号“;”开头
5
2013-7-19
4.1.3 汇编语言的语句格式
Keil的汇编器A51可以识别的语句形式为:
[标号:] 指令助记符 [操作数1,] [操作数2,] [操作数3,] [;注释]
标号(即符号地址)
非数字字符开头,后跟字母、数字、“-”、“?” 等 不能用已定义的保留字(指令助记符、伪指令等) 后跟英文冒号“:”
30H,#2
;转移序号为2时,置功能号“2”于30H单
30H,#3
;转移序号为3时,置功能号“3”于30H单
30H,#4
;转移序号为4时,置功能号“4”于30H单
23
4.3.3 循环程序
(2种:先执行,后判断;先判断,后执行)
【例4-4】将内部RAM的30H至3FH单元初始化为00H。
开始
置初值
循环处理 循环修改 N
7
2013-7-19
表4.1
优先级
运 算 符
功
能
表达式及其结果示例 4*(5+6)即44 NOT 55H 即AAH; HIGH 1234H 即12H +5、-6 17 / 5 即3; 17 MOD 5 即2
() NOT、HIGH、 LOW
高 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 低·
括号 取反、取高字节、取低 字节 正号、负号 乘、除(取商)、取余 数
2013-7-19
15
4.3 基本程序结构
一般不影响标志寄存器PSW的状态。
传送类指令有两大类
一般传送( MOV ) 特殊传送,如: MOVC MOVX PUSH、POP XCH、XCHD SWAP
2013-7-19
16
4.3 基本程序结构
4.3.1 顺序程序
(无分支、无循环)
开始
【例4-1】片内RAM的21H单
2013-7-19
2
4.1 程序编制的方法和技巧
4.1.1 程序编制的步骤 任务分析
明确任务:功能要求、技术指标 运行环境调研
算法设计
将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求与运行速度)
2013-7-19
3
流程描述
流程图符号
开始或结束符号 判断分支符号
“超级循环”框架
开始
初始化
2013-7-19
0040H A,21H A,#0FH A 20H,A A,22H A,#0FH 20H,A $
;取十位ASCII码 ;保留低半字节 ;移至高半字节 ;存于20H单元 ;取个位ASCII码 ;保留低半字节 ;合并到结果单元
18
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并送回原单 元。
2013-7-19
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
;以转移序号3为例
;置分支入口地址表首址 ;乘2,调整偏移量
;取地址高字节,暂存于R3
;取地址低字节 ;处理程序入口地址低8位送DPL ;处理程序入口地址高8位送DPH
2013-7-19
8
4.2 源程序的编辑和汇编
目标程序的产生过程如下图:
汇编源文件 .ASM
汇编器 A51.EXE
目标文件 (浮动地址) .OBJ
调试目标文件 (绝对地址) 无扩展名
可烧写 目标文件 .HEX
.LST
连接器 BL51.EXE
转换器 OH51.EXE
编译器 C51.EXE .M51
写入芯片 仿真调试
工作任务符号 程序连接符号
循环扫描、处理
程序流向符号 程序流向符号
2013-7-19
4
4.1.2 程序编制的方法和技巧 强化模块观念
程序模块(主程序模块、各种子程序模块) 模块化优点:分块设计、便于阅读、调试方便
采用循环和子程序
使程序占用空间减少、结构清晰 循环初值和结束条件,避免“死机”现象 子程序的现场保护(注意栈平衡、寄存器内容) 对中断子程序还有注意保护PSW的内容
11
2013-7-19
4.2.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
起始地址设定伪指令ORG
ORG 8000H 表达式通常为十六进制地址,例: START:MOV A,#30H ORG可多次使用,但地址值的顺序要由小到大 … … ORG 表达式
结束汇编伪指令END END
2013-7-19
26
4.4.1 现场保护与恢复 在主程序中实现(结构灵活)
PUSH 号) PUSH PUSH MOV LCALL POP POP POP PSW
ACC B PSW,#10H addr16 B ACC PSW
;保护现场( 含当前工作寄存器组
; ; ;切换当前工作寄存器组 ;子程序调用, ;恢复现场 ; ;含当前工作寄存器组切换
2013-7-19
27
在子程序中实现(程序规范、清晰)
SUB1:PUSH 号) PUSH PUSH MOV … … POP POP POP RET PSW ;保护现场( 含当前工作寄存器组
ACC ; B ; PSW,#10H ;切换当前工作寄存器组
B ACC PSW
;恢复现场 ; ;内含当前工作寄存器组切换
符号名为: 地址 常数 段名 字符串 寄存器名 位名 比较:标号只能是地址
2013-7-19 14
定义位地址为符号名伪指令BIT
符号名 BIT 位地址表达式 P1.0 0D7H ;将P1.0的位地址赋给符号名ST ;将位地址为D7H的位定义为符号名 如: ST BIT CF BIT