- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 4 章 汇编语言程序设计简介
例 2 将两个半字节数合并成一个一字节数。
设内部RAM 40H, 41H单元中分别存放着 8 位二进制数, 要求取出两个单元中的低半字节, 并成一个字节后, 存入 50H单元中。 程序如下:
START: MOV R1, #40H MOV A, @R1 ANL A, #0FH SWAP A INC R1 XCH A, @R1 ANL A, # 0FH ORL A, @R1 MOV 50H, A RET
第 4 章 汇编语言程序设计简介
ORG 1000H
BUF1: DB 38H, 7FH, 80H
BUF2: DB 45H, 66H ORG伪指令指定了标号BUF1的地址为1000H, 而DB伪 指 令 是 将 其 后 的 二进 制 数 表 38H, 7FH, 80H 依次存 放 在 1000H, 1001H, 1002H 3 个连续单元之中, BUF2也是一个标 号, 其地址与前一条伪指令连续, 即1003H, 1004H地址单元 中依次存放 45H, 66H。
第 4 章 汇编语言程序设计简介
五、 定义字指令DW 指令格式: [标号:] DW 16 位数据表 该指令的功能与DB相似, 区别仅在于从指定地址开始存 放的是指令中的 16 位数据, 而不是字节串。每个 16 位数据 要占两个存储单元, 高8 位先存, 低 8 位后存。
第 4 章 汇编语言程序设计简介
第 4 章 汇编语言程序设计简介
例 11 根据工作寄存器R0 内容的不同, 使程序转入相 应的分支。
(R0)=0 对应的分支程序标号为PR0; (R0)=1 对应的分支程序标号为PR1;
(R0)=N 对应的分支程序标号为PRN。
…
第 4 章 汇编语言程序设计简介
程序如下: LP0: MOV DPTR, #TAB
程序的基本算法结构有 4 种: 顺序结构、 分支(选择) 结构、循环结构和子程序结构。
第 4 章 汇编语言程序设计简介
4.2.1 顺序程序设计
顺序结构是最简单的一种基本结构。 例 1 两个无符号双字节数相加。 设被加数存放于内部RAM的40H(高位字节), 41H(低 位字节), 加数存放于50H(高位字节), 51H(低位字节), 和数存入 40H和41H单元中。
第 4 章 汇编语言程序设计简介
第4章 汇编语言程序设计简介
4.1 伪指令 4.2 汇编语言程序设计
第 4 章 汇编语言程序设计简介
4.1 伪 指 令
1. 汇编程序
MCS—51 指令所编写的汇编语言源程序, 还必须经过从 汇编源程序到机器语言目标程序的“ 翻译”, 才能在 51 系列 单片机运行, 这种翻译的过程称为汇编。 完成汇编工作有两种 途径: 一种是人工汇编; 一种是机器汇编。 对于量小、 简单的 程序, 程序员经过查指令系统表, 将汇编源程序逐条翻译成机 器代码, 完成手工汇编, 再从单片机开发装置的键盘上输入目 标程序进行调试、 运行。
第 4 章 汇编语言程序设计简介
2. 伪 指 令
在汇编源程序的过程中, 还有一些指令不要求计算机进 行任何操作, 也没有对应的机器码, 不产生目标程序, 不影响 程序的执行, 仅仅是能够帮助汇编进行的一些指令, 称之为伪 指令。 它主要用来指定程序或数据的起始位置, 给出一些连 续存放数据的确定地址, 或为中间运算结果保留一部分存储 空间以及表示源程序结束等等。 不同版本的汇编语言, 伪指 令的符号和含义可能有所不同, 但是基本用法是相似的。 下 面介绍几种常用的基本伪指令。
PA8155 EQU 8001H 即给标号PA8155赋值为8001H。
第 4 章 汇编语言程序设计简介
四、 定义字节指令DB 指令格式:
[标号: ] DB 8位二进制数表 功能: 把 8 位二进制数表依次存入从标号开始的连续的 存储单元中。
格式中, 标号区段可有可无, DB指令之后的 8 位二进制 数表是字节常数或用逗号隔开的字节串, 也可以是用引号括 起来的ASCII码字符串 (一个 ASCII字符相当于一个字节)。 例:
; 跳至不同的分支
第 4 章 汇编语言程序设计简介
二、 汇编结束指令END 指令格式:
END 功能: 提供汇编结束标志。汇编程序遇到 END后就停 止汇编, 对 END以后的语句不予处理, 故 END应放在程序 的结束处。
第 4 章 汇编语言程序设计简介
三、等值指令EQU 指令格式: 字符名称 EQU 数字或汇编符号
第 4 章 汇编语言程序设计简介
例 3 x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解:
1 y 1
0
x0 x0 x0
分析:
图 4.2
第 4 章 汇编语言程序设计简介
程序如下:
START: CJNE R0, #00H, SUL1 ; R0中的数与00比较不等转移
; 设置R1为数据指针 ; 取出第一个单元中的内容 ; 取第一个数的低半字节 ; 移至高半字节 ; 修改数据指针 ; 取第二个单元中的内容 ; 取第二个数的低半字节 ; 拼字 ; 存放结果
第 4 章 汇编语言程序设计简介
4.2.2 分支程序设计
在实际的程序设计中, 有很多情况往往还需要程序按照给 定的条件进行分支。 这时就必须对某一个变量所处的状态进 行判断, 根据判断结果来决定程序的流向。 这就是分支(选 择)结构程序设计。
第 4 章 汇编语言程序设计简介
程序如下: START: CLR C
MOV R0, #41H MOV R1, #51H AD1: MOV A, @R0 ADD A,@R1 MOV @R0, A DEC R0 DEC R1 MOV A, @R0 ADDC A, @R1 MOV @R0, A RET
; 将Cy清零 ; 将被加数地址送数据指针R0 ; 将加数地址送数据指针R1 ; 被加数低字节的内容送入A ; 两个低字节相加 ; 低字节的和存入被加数低字节中 ; 指向被加数高位字节 ; 指向加数高位字节 ; 被加数高位字节送入A ; 两个高位字节带Cy相加 ; 高位字节的和送被加数高位字节
第 4 章 汇编语言程序设计简介
4.2 汇编语言程序设计
用汇编语言进行程序设计的过程和用高级语言进行程序 设计相类似。 对于比较复杂的问题, 首先要掌握解决它的方 法和步骤——算法, 有了合适的算法常常可以起到事半功倍的 效果; 其次, 就是用操作框、 带箭头流程线、 框内外必要的 文字说明所组成的流程图来描述算法; 最后是根据流程图用 程序设计语言来编制程序。
第 4 章 汇编语言程序设计简介
例: ORG 2000H MOV SP, #60H MOV R0, #2FH MOV R2, # 0FFH
ORG伪指令说明其后面程序的目标代码在存储器中存放的 起始地址是2000H, 即
存储器地址 目标程序
ቤተ መጻሕፍቲ ባይዱ
2000H 2003H 2005H
75 81 60 78 2F 7A FF
MOV DPTR, #TAB MOV A, R0 MOV B, #03H MUL AB XCH A, B
; 长跳转指令占 3 个字节
第 4 章 汇编语言程序设计简介
ADD A, DPH MOV DPH, A XCH A, B JMP @A+DPTR
; 跳至散转表中相应的位置
…
TAB: LJMP PR0 LJMP PR1
第 4 章 汇编语言程序设计简介
2. 伪 指 令
一、 汇编起始指令 ORG 指令格式为:
ORG nn 该指令的作用是指明后面的程序或数据块的起始地址, 它总是出现在每段源程序(主程序、 子程序)或数据块的开 始。 式中, nn为 16 位地址, 汇编时nn确定了此语句后面第一 条指令或第一个数据的地址,此后的源程序或数据块就依次连 续存放在以后的地址内, 直到遇到另一个ORG指令为止。
第 4 章 汇编语言程序设计简介 例 4 比较两个无符号数的大小。 设外部RAM的存储单元ST1和ST2中存放两个不带符号的
二进制数, 找出其中的大数存入外部RAM中的ST3单元中。
图 4.3
第 4 章 汇编语言程序设计简介
程序如下:
START: MOV DPTR, #ST1 ; 第一个数的指针
功能: 使指令中的字符名称等价于给定的数字或汇编符号。 使用等值指令可给程序的编制、调试、修改带来方便, 如果在 程序中要多次使用到某一地址,由EQU指令将其赋值给一个字 符名称, 一旦需要对其进行变动, 只要改变EQU命令后面的数字 即可, 而不需要对程序中涉及到该地址的所有指令逐句进行修 改。 但要注意, 由 EQU等值的字符名称必须先赋值后使用, 且 在同一个源程序中, 同一个标号只能赋值一次。 例:
六、 定义存储空间指令DS 指令格式: [标号:] DS 表达式 该伪指令的功能是从标号指定的单元开始, 保留若干字 节的内存空间以备源程序使用。
例如: ORG 1000H DS 20H DB 30H, 8FH
汇编后: 从 1000H开始, 预留 32(20H)个字节的内存单元, 然后从 1020H开始, 按照下一条DB指令赋值, 即 (1020H)=30H, (1021H)=8FH
MOV R1, #00H
; 相等, R1← 0
SJMP SUL2
SUL1: JC NEG MOV R1, #01H
; 两数不等, 若(R0)<0, 转向NEG ; (R0)>0, 则 R1←01H
SJMP SUL2
NEG: MOV R1, #0FFH
; (R0)<0, 则 R1←0FFH
SUL2: RET
MOVX A, @DPTR ; 取第一个数
MOV R2, A
; 保存
MOV DPTR, #ST2 ; 第二个数的指针