第4章汇编语言程序设计教案Word文档下载推荐.docx
《第4章汇编语言程序设计教案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第4章汇编语言程序设计教案Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
教学过程设计:
复习0分钟;
授新课100分钟
讨论0分钟;
其它0分钟
授课类型(请打√):
理论课√讨论课□实验课□习题课□其它□
教学方式(请打√):
讲授√讨论□示教□指导□其它□
教学手段(请打√):
多媒体√模型□实物□挂图□音像□其它□
4.1汇编语言程序设计概述
程序实际上是一系列计算机指令的有序集合。
我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程,称为程序设计。
程序设计是单片机应用系统设计的重要组成部分,单片机的全部动作都是在程序的控制下进行的。
随着芯片技术的发展,很多标准的或功能型的硬件电路都集成到了芯片中,所以,软件设计在单片机应用系统开发中占的比重越来越大。
一、汇编语言和高级语言
汇编语言:
用助记符表示的指令称为汇编语言,用汇编语言编写的程序称为汇编语言源程序
汇编语言也是面向机器的,它仍是一种低级语言。
汇编语言离不开具体计算机的硬件,与硬件紧密相关。
高级语言:
高级语言不受具体“硬件”的限制,具有通用性强,直观、易懂、易学,可读性好等优点。
多数的51单片机用户使用C语言来进行程序设计。
C语言已经成为人们公认的高级语言中高效、简洁而又贴近51单片机硬件的编程语言。
二、汇编语言的特点
•助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
•使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
•汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
•汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。
三、汇编语言的语句格式
•指令语句:
每一条指令语句在汇编时都产生一个指令代码(也称机器代码),执行该指令代码对应着机器的一种操作。
•伪指令语句:
伪指令语句是控制汇编(翻译)过程的一些控制命令。
在汇编时没有机器代码与之对应。
四、汇编语言程序框架
完成控制任务的汇编语言源程序基本上由主程序、子程序、中断服务子程序等组成。
程序的起始地址必须从0000H开始。
五、汇编语言的编辑和汇编
编写-----在一个编辑工具上进行
变成机器码-----通过汇编器完成
六、汇编语言程序设计方法
(1)任务分析(硬件、软件系统分析)
(2)确定算法和工作步骤
(3)制定程序流程图
(4)分配内存,确定程序与数据区存放地址
(5)编写源程序
(6)调试、修改,最终确定程序
汇编时为了便于汇编器的操作,汇编程序提供了一些本身的操作命令,比如汇编器汇编时需要知道汇编语言源程序中哪些是数据,数据的状态,程序的起始和终止等。
这些汇编器本身的操作指令可以出现在汇编语言源程序中,但它不控制单片机操作,而是控制汇编器的指令。
这些指令称为伪指令。
伪指令是程序员发给汇编器的命令,也称为汇编命令或汇编程序控制指令。
常用伪指令
1.ORG(ORiGin)汇编起始地址命令
[<
标号:
>
]ORG<
地址>
例:
ORG0000H
ORG0023H
2.END(ENDofassembly)汇编终止命令
]END[<
表达式>
]
3.EQU(EQUate)赋值命令
<
字符名称>
EQU<
赋值项>
TTY:
EQU1080H
LOOP1:
EQUTTY
4.DB(DefineByte)定义数据字节命令
]DB<
8位数表>
HERE:
DB80H
5.DW(DefineWord)定义数据字命令
]DW<
16位数表>
DW1080H
6.DS(DefineStonage)定义存储区命令
]DS<
DS0100H
7.BIT定义位命令
<
BIT<
位地址>
BIT7FH
第9课
汇编语言程序设计一般采用模块化编程,基本程序结构有三种:
顺序结构、分支结构和循环结构。
这三种结构组合起来,可以解决任何复杂问题。
1、汇编语言源程序由以下两种指令构成
汇编语句(指令语句)
伪指令(指示性语句)
2、汇编语句的格式:
操作码操作数;
注释
数据表示形式:
二进制(B)、十六进制(H)、十进制(D或省略)、ASCII码(以单引号标识)
3、伪指令:
控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。
一、顺序程序
顺序结构是最简单、最基本的程序结构,其特点是按指令的排列顺序一条一条地执行,直到全部指令执行完毕为止。
不管多么复杂的程序,总是由若干顺序程序段所组成的
[例]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;
加数在内部RAM的53H、54H和55H单元中;
要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。
MOVR0,#52H;
被加数的低字节地址
MOVR1,#55H;
加数的低字节地址
MOVA,@R0
ADDA,@R1;
低字节相加
MOV@R0,A;
存低字节相加结果
DECR0
DECR1
ADDCA,@R1;
中间字节带进位相加
存中间字节相加结果
ADDCA,@R1;
高字节带进位相加
存高字节相加结果
MOV00H,C;
进位送00H位保存
更简单的编程是不通过R0,R1间接寻址,直接和内存单元之间求和,程序如下:
MOVA,52H
ADDA,55H;
MOV52H,A;
MOVA,51H
ADDA,54H;
中字节带进位相加
MOV51H,A;
存中字节相加结果
MOVA,50H
ADDA,53H;
MOV50H,A;
存高字节相加结
MOV00H,C;
END
二、分支程序
在实际程序设计过程中,会有很多复杂状态和条件,需要根据这些条件进行不同的选择。
这时就必须对某一变量的状态进行判断,根据判断结果选择不同的程序流向,这就是分支程序。
分支程序有:
单分支结构、双分支结构、多分支结构(散转)。
常用指令:
JZ(JNZ)、CJNE、JC(JNC)及JB(JNB)等它们是分支结构程序设计的基础,可以完成各种各样的条件判断,控制转移方向。
【例】两个无符号数比较(单分支)。
内部RAM的30H单元和40H单元各存放了一个8位无符号数,请比较这两个数的大小。
若(30H)≥(40H),则将地址为20H的内存单元置0;
否则,则将地址为20H的内存单元置1。
ORG0000H
MOVA,30H;
被减数放入累加器中
CLRC
SUBBA,40H;
两数相减
JCL1;
有进位(借位),则前小后大
MOV20H,#00H
LJMPL2
L1:
MOV20H,#01H
L2:
LJMP$
END
【例】变量X存放在UNIT1单元内,函数值Y存放在UNIT2单元中,试按下式的要求给Y赋值。
ORG0000H
UNIT1DATA30H
UNIT2DATA31H
MOVA,UNIT1;
A←X
JZDONE;
若X=0,则转DONE
JNBACC.7,POSI;
若X>
0,则转POSI
MOVA,#0FFH;
若X<
0,则Y=-1
LJMPDONE
POSI:
MOVA,#01H;
0,则Y=1
DONE:
MOVUNIT2,A;
存函数值
LJMP$
散转程序是一种并行分支程序,它可根据运算结果或输入数据将程序转入不同的分支。
散转指令:
“JMP@A+DPTR”
特点:
转移的目标地址不是在编程或汇编时预先确定的,而是在程序运行过程中动态地确定的
三、循环程序
在程序设计过程中,经常会遇到需要重复执行某一段程序的情况,这时可以使用循环程序结构,以便缩短程序存储空间,提高程序的质量。
循环程序结构只是分支程序中的一个特殊形式
组成:
(1)置循环初值,即确立循环开始时的状态。
(2)循环体(工作部分),要求重复执行的部分。
(3)循环修改,循环程序必须在一定条件下结束。
(4)循环控制部分,根据循环结束条件,判断是否结束循环。
控制方法:
⏹循环次数已知,利用循环次数控制;
⏹循环次数未知,利用关键字控制。
【例】从BLOCK单元开始存放一组无符号数,一般称为一个数据块。
数据块长度放在LEN单元,编写一个求和程序,将和存入SUM单元,假设和不超过8位二进制数。
LENDATA20H
SUMDATA21H
BLOCKDATA22H
ORG0000H
CLRA;
清累加器
MOVR2,LEN;
数据块长度送R2
MOVR1,#BLOCK;
数据块首址送Rl
LOOP:
ADDA,@R1;
循环做加法
INCR1;
修改地址指针
DJNZR2,LOOP;
修改计数器并判断
MOVSUM,A;
存和
第10课
复习10分钟;
授新课80分钟
讨论10分钟;
四、子程序
带通用性问题,可以把它设计成通用子程序以供调用。
这样使程序紧凑,缩短程序长度,调式方便。
1子程序结构应具备
1)必须标明子程序入口地址,即名称
2)必须以返回指令RET结束子程序
2子程序设计时注意事项
1)要能正确传递参数:
入口条件:
子程序中要处理的数据如何给予。
出口条件:
子程序处理结果如何存放(寄存器、存储器、堆栈方式)。
2)保护与恢复现场:
保护现场:
压栈指令PUSH
恢复现场:
弹出指令POP
3子程序特性
1)通用性
2)可浮动性
3)可递归和重入性
【例】求平方和c=a2+b2,设a,b是个位数,分别存于内部RAM的A1、A2两个单元,计算结果存在内部RAM的A3单元中。
分析
考虑到a,b是个位数,我们可以设定一个个位数乘法的表格,可以利用MOVCA,@A+DPTR语句,用查表的方法来计算a和b的平方。
因为c是两个数的平方和,两次求平方可以采用子程序,在子程序用累加器A来传递参数。
MOVA,A1;
取a
LCALLSQR;
调用查表子程序
MOVR1,A;
a的平方暂存R1中
MOVA,A2;
取b
LCALLSQR;
ADDA,R1;
求出平方和暂存在A中
MOVA3,A;
结果存于A3中
LJMP$
SQR:
MOVDPTR,#TAB;
子程序
MOVCA,@A+DPTR
RET
TAB:
DB0,1,4,9,16,25,36,49,64,81
END
【例】把内部RAM某一单元中一个字节的十六进制数转换成两位ASCII码,结果存放在内部RAM的连续两个单元中。
MAIN:
MOVSP,#30H
MOVRl,#50H;
Rl为存结果的指针
MOVA,40H;
A为需转换的十六进制数
SWAPA;
先转换高位半字
PUSHACC;
压栈
LCALLHEASC;
调用将低半字节的内容转换
POPACC
MOV@Rl,A;
存高半字节转换结果
INCRl
MOVA,40H
PUSHACC
LCALLHEASC
存低半字节转换结果
LJMP$
HEASC:
MOVR0,SP;
DECR0
DECR0;
R0指向十六进制数参数地址
XCHA,@R0;
取被转换参数
ANLA,#0FH;
保留低半字节
ADDA,#02H;
修改A值,因为XCHA,@R0和RET指令;
长度均为1个字节,合计2个字节
MOVCA,@A+PC;
查表
XCHA,@R0;
结果送回堆栈
RET
DB30H,31H,32H.…