51单片机 汇编程序的编写
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
汇编程序的基本知识
• 汇编语言的构成
– 指令性语句(51指令系统) – 指示性语句:伪指令 – 伪指令:伪指令不属于MCS51指令系统中的指令, 它是程序员发给汇编程序的命令,也称为汇编程序 控制命令。
• 程序设计流程
4
常用的部分伪指令
• • • • ORG END EQU DB
5
伪指令简介
25
子程序的参数传递 (方法很多)
通过寄存器传递
MAIN: mov r0,#30H mov r7,#0AH lcall SUBR mov b,r1 …………. SUBR: push a mov a,r7 clr c subb a,r0 mov r1,a pop a ret end
26
作业1:硬件ቤተ መጻሕፍቲ ባይዱ基本操作
14
注 意
• 使用条件转移指令形成分支前
一定保证供条件转移指令进行判别的条件是有意 义的。
JC LOOP
• 正确选定所用的转移条件及转移目标地 址
15
循环程序
• 循环初始化
– 循环次数计数器、工作寄存器设初值等
• 循环体
– 尽量简练
• 循环控制
– 检查结束条件,及时退出循环
16
注意循环嵌套
允许外重循环嵌套内重循环 循环体不能交叉 不能从循环程序外部跳入循环程序内部
22
查表指令的使用
例 求0~9的平方 ORG 0000H LJMP A1 ORG 0080H A1: NOP NOP MOV SP,#60H MOV DPTR,#tab MOV A,#03H;将0~9之内任意一个数赋值给A。 MOVC A,@A+DPTR A2: SJMP A2 Tab: DB 00h,01h,04h,09h,10h,19h,24h,31h,40h,51h END
28
END
29
[标号]:操作码助记符 [第1操作数],[第2操作数];[注释] Loop1: mov a, #0ffh; 累加器A赋值为ff mov a,#10h mov a,#16 标号:表示该指令所在的符号地址,一般由字母和数字组成, 第一位为字母,其余位为字母、数字任选。 操作码助记符、第1操作数和 第2操作数:指令的核心部分。对于某 些指令可能不存在完整的两个操作数。 注释:是由用户加入的文本,对汇编程序不起任何作用,只是方便 阅读。 * 第1操作数又称目的操作数,第2操作数又称源操作数 ** 51不区分大小写
ORG 起点指令 ORG addr16 org 0000h ORG指令用于指明程序代码或数据块在存储器中的 起始地址。addr16代表一个16位地址,即程序或数据 块的首地址。 EQU 等值指令 符号 EQU 表达式 aaa equ 30h mov a,aaa EQU指令用于为程序中的任意符号赋值。 程序中的常量通常可以用符号代替,便于修改。 主程序前要先用equ指令为常量符号赋值。
8
程序结构:
顺序结构 循环结构
分支结构
子程序结构
……
复合结构:多种程序结构的组合
9
简单程序(顺序结构) • 大量使用数据传送类指令 • 注意正确选择指令以提高效率
10
将20H单元内的压缩BCD码变换成相应 ASCII码放在21H、22H中
• Org 0h • Ljmp 2000h • ORG 2000H • MOV R0,#22H • MOV @R0,#00 • MOV A,20H • XCHD A,@R0 • ORL 22H,#30H • SWAP A • ORL A,#30H • MOV 21H,A • z:SJMP z • END 15BYTE ,11T
6
伪指令简介
DB 定义字节指令
[标号]: DB 数据列表 DB指令用于定义字节型数据或数据串,并将数据作为 常数填入指定的存储器单元中。
END 结束汇编指令
[标号]: END END指令置于程序结尾处,作为源程序结束的标志。
7
程序设计流程
(1)明确要求和要达到的目的 (2)确定解决问题的计算方法和步骤 (3)画出流程图 (4)分配内存地址 (5)按流程图编写程序 (6)上机汇编、调试、修改直至最后确定源程序
17
例:10个数据排序
• 常用气泡法(两两比较法):它先使E0和 E1进行比较,若E0>E1,则两数交换,否则不 动,然后E1和E2进行比较,按同样的原则,决 定是否交换,一直比较下去,最后完成E8和E9 的比较及交换。经过10-1次比较后,E9位 置必然得到数组中的最大值。犹如一个气 泡冒到水顶,如此循环即可完成排序。
如何对sfr中的内容进行读写?
如何对52系列单片机的高128字节 RAM进行读写? 如何读出片外数据存储器字节地址为 2000H中的内容?
27
作业2:显示子程序编制
• 编制一个显示子程序 • 要求:待显示量存放在R1中,得到的显示码存 放在R2中。 • 数码管段与数据位关系,显示为低电平驱动
12
分支程序 • 根据程序要求无条件或有条件改变程序 执行的顺序,选择程序的流向 • 特点:程序中含有转移类指令 • 关键:正确选用转移指令
13
正确运用转移指令
• 无条件分支程序
– 程序设计者事先设计好的 – LJMP
• 有条件分支程序
– 根据已经执行的程序中标志位、A或内部 RAM的某些位的结果决定程序的流向 – JZ/JNZ、CJNE、DJNZ、位控制转移类指令 (JC、JNC、JB、JNB、JBC)
23
子程序的设计
• 子程序和运算程序是程序设计的两大支 柱。 • 子程序的概念:完成确定任务,并能为其 他程序反复调用的程序段。要求子程序 在结构上具有通用性和独立性。 例如:代码转换,运算程序等。
24
子程序编写的注意事项
• 子程序调用:LCALL • 子程序返回:RET • 子程序嵌套注意的问题:嵌套深度与堆栈 区大小的问题. • 子程序第一条必须有标号. • 正确传递参数:入口参数和出口参数. • 注意现场的保护和恢复
18
将RAM地址为50H~59H中的10 个数据,从小到大进行排序 (实验1)
Size equ 10 Change equ 00H Sort: mov rO, #50H mov r7, #Size-l clr Change Goon: Mov a, @r0 Inc r0 mov B, @r0 cjne a, B, NotEqual sjmp Next NotEqual: jc Next setb Change xch a, @r0 dec rO xch a, @r0 inc rO Next: Djnz r7, Goon Jb Change, Sort Ljmp $ end
• • • • • • • • • MOV A,20H MOV B,#10H DIV AB ORL B,#30H MOV 22H,B ORL A,#30H MOV 21H,A SJMP $ END
15BYTE 14T
11
BCD码与ASCII码对照
• • • • • 0——30H 2——32H 4——34H 6——36H 8——38H 1——31H 3——33H 5——35H 7——37H 9——39H
MCS-51 单 片 机 原 理 及 设 计
第5讲:汇编程序的编写
电气工程系 赵志衡 Tel:86413623 E-mail:zhzhhe@hit.edu.cn
1
MCS-51 汇 编 程 序 的 编 写
课程主要内容
• 汇编程序的基本知识 • 常用汇编程序设计方法
2
汇编程序的基本知识
汇编指令的基本结构:
19
查表程序的设计
主要用于 • 复杂代码转换显示 • 数据补偿:传感器补偿 • 复杂函数计算: Y=SIN(X)
20
查表指令
• 在51中建议使用的查表指令为 MOVC A,@A+DPTR
最好不用 MOVC A,@A+PC !
21
查表指令的使用
例 求0~9的平方 ORG 0000H LJMP A1 ORG 0080H A1: NOP NOP MOV SP,#60H MOV DPTR,#2000H MOV A,#03H;将0~9之内任意一个数赋值给A。 MOVC A,@A+DPTR A2: SJMP A2 ORG 2000H DB 00h,01h,04h,09h,10h,19h,24h,31h,40h,51h END
汇编程序的基本知识
• 汇编语言的构成
– 指令性语句(51指令系统) – 指示性语句:伪指令 – 伪指令:伪指令不属于MCS51指令系统中的指令, 它是程序员发给汇编程序的命令,也称为汇编程序 控制命令。
• 程序设计流程
4
常用的部分伪指令
• • • • ORG END EQU DB
5
伪指令简介
25
子程序的参数传递 (方法很多)
通过寄存器传递
MAIN: mov r0,#30H mov r7,#0AH lcall SUBR mov b,r1 …………. SUBR: push a mov a,r7 clr c subb a,r0 mov r1,a pop a ret end
26
作业1:硬件ቤተ መጻሕፍቲ ባይዱ基本操作
14
注 意
• 使用条件转移指令形成分支前
一定保证供条件转移指令进行判别的条件是有意 义的。
JC LOOP
• 正确选定所用的转移条件及转移目标地 址
15
循环程序
• 循环初始化
– 循环次数计数器、工作寄存器设初值等
• 循环体
– 尽量简练
• 循环控制
– 检查结束条件,及时退出循环
16
注意循环嵌套
允许外重循环嵌套内重循环 循环体不能交叉 不能从循环程序外部跳入循环程序内部
22
查表指令的使用
例 求0~9的平方 ORG 0000H LJMP A1 ORG 0080H A1: NOP NOP MOV SP,#60H MOV DPTR,#tab MOV A,#03H;将0~9之内任意一个数赋值给A。 MOVC A,@A+DPTR A2: SJMP A2 Tab: DB 00h,01h,04h,09h,10h,19h,24h,31h,40h,51h END
28
END
29
[标号]:操作码助记符 [第1操作数],[第2操作数];[注释] Loop1: mov a, #0ffh; 累加器A赋值为ff mov a,#10h mov a,#16 标号:表示该指令所在的符号地址,一般由字母和数字组成, 第一位为字母,其余位为字母、数字任选。 操作码助记符、第1操作数和 第2操作数:指令的核心部分。对于某 些指令可能不存在完整的两个操作数。 注释:是由用户加入的文本,对汇编程序不起任何作用,只是方便 阅读。 * 第1操作数又称目的操作数,第2操作数又称源操作数 ** 51不区分大小写
ORG 起点指令 ORG addr16 org 0000h ORG指令用于指明程序代码或数据块在存储器中的 起始地址。addr16代表一个16位地址,即程序或数据 块的首地址。 EQU 等值指令 符号 EQU 表达式 aaa equ 30h mov a,aaa EQU指令用于为程序中的任意符号赋值。 程序中的常量通常可以用符号代替,便于修改。 主程序前要先用equ指令为常量符号赋值。
8
程序结构:
顺序结构 循环结构
分支结构
子程序结构
……
复合结构:多种程序结构的组合
9
简单程序(顺序结构) • 大量使用数据传送类指令 • 注意正确选择指令以提高效率
10
将20H单元内的压缩BCD码变换成相应 ASCII码放在21H、22H中
• Org 0h • Ljmp 2000h • ORG 2000H • MOV R0,#22H • MOV @R0,#00 • MOV A,20H • XCHD A,@R0 • ORL 22H,#30H • SWAP A • ORL A,#30H • MOV 21H,A • z:SJMP z • END 15BYTE ,11T
6
伪指令简介
DB 定义字节指令
[标号]: DB 数据列表 DB指令用于定义字节型数据或数据串,并将数据作为 常数填入指定的存储器单元中。
END 结束汇编指令
[标号]: END END指令置于程序结尾处,作为源程序结束的标志。
7
程序设计流程
(1)明确要求和要达到的目的 (2)确定解决问题的计算方法和步骤 (3)画出流程图 (4)分配内存地址 (5)按流程图编写程序 (6)上机汇编、调试、修改直至最后确定源程序
17
例:10个数据排序
• 常用气泡法(两两比较法):它先使E0和 E1进行比较,若E0>E1,则两数交换,否则不 动,然后E1和E2进行比较,按同样的原则,决 定是否交换,一直比较下去,最后完成E8和E9 的比较及交换。经过10-1次比较后,E9位 置必然得到数组中的最大值。犹如一个气 泡冒到水顶,如此循环即可完成排序。
如何对sfr中的内容进行读写?
如何对52系列单片机的高128字节 RAM进行读写? 如何读出片外数据存储器字节地址为 2000H中的内容?
27
作业2:显示子程序编制
• 编制一个显示子程序 • 要求:待显示量存放在R1中,得到的显示码存 放在R2中。 • 数码管段与数据位关系,显示为低电平驱动
12
分支程序 • 根据程序要求无条件或有条件改变程序 执行的顺序,选择程序的流向 • 特点:程序中含有转移类指令 • 关键:正确选用转移指令
13
正确运用转移指令
• 无条件分支程序
– 程序设计者事先设计好的 – LJMP
• 有条件分支程序
– 根据已经执行的程序中标志位、A或内部 RAM的某些位的结果决定程序的流向 – JZ/JNZ、CJNE、DJNZ、位控制转移类指令 (JC、JNC、JB、JNB、JBC)
23
子程序的设计
• 子程序和运算程序是程序设计的两大支 柱。 • 子程序的概念:完成确定任务,并能为其 他程序反复调用的程序段。要求子程序 在结构上具有通用性和独立性。 例如:代码转换,运算程序等。
24
子程序编写的注意事项
• 子程序调用:LCALL • 子程序返回:RET • 子程序嵌套注意的问题:嵌套深度与堆栈 区大小的问题. • 子程序第一条必须有标号. • 正确传递参数:入口参数和出口参数. • 注意现场的保护和恢复
18
将RAM地址为50H~59H中的10 个数据,从小到大进行排序 (实验1)
Size equ 10 Change equ 00H Sort: mov rO, #50H mov r7, #Size-l clr Change Goon: Mov a, @r0 Inc r0 mov B, @r0 cjne a, B, NotEqual sjmp Next NotEqual: jc Next setb Change xch a, @r0 dec rO xch a, @r0 inc rO Next: Djnz r7, Goon Jb Change, Sort Ljmp $ end
• • • • • • • • • MOV A,20H MOV B,#10H DIV AB ORL B,#30H MOV 22H,B ORL A,#30H MOV 21H,A SJMP $ END
15BYTE 14T
11
BCD码与ASCII码对照
• • • • • 0——30H 2——32H 4——34H 6——36H 8——38H 1——31H 3——33H 5——35H 7——37H 9——39H
MCS-51 单 片 机 原 理 及 设 计
第5讲:汇编程序的编写
电气工程系 赵志衡 Tel:86413623 E-mail:zhzhhe@hit.edu.cn
1
MCS-51 汇 编 程 序 的 编 写
课程主要内容
• 汇编程序的基本知识 • 常用汇编程序设计方法
2
汇编程序的基本知识
汇编指令的基本结构:
19
查表程序的设计
主要用于 • 复杂代码转换显示 • 数据补偿:传感器补偿 • 复杂函数计算: Y=SIN(X)
20
查表指令
• 在51中建议使用的查表指令为 MOVC A,@A+DPTR
最好不用 MOVC A,@A+PC !
21
查表指令的使用
例 求0~9的平方 ORG 0000H LJMP A1 ORG 0080H A1: NOP NOP MOV SP,#60H MOV DPTR,#2000H MOV A,#03H;将0~9之内任意一个数赋值给A。 MOVC A,@A+DPTR A2: SJMP A2 ORG 2000H DB 00h,01h,04h,09h,10h,19h,24h,31h,40h,51h END