单片机的软件基础:汇编语言与程序设计**

来自:一咻
4年前
已收藏
收藏
阅读数
149
回复数
0

(1)机器与程序。 这里的“机器”是指计算机的硬件,主要包括CPU、ROM、RAM、IO、中断/定时及接口电路等。程序是指能完成所设定的任务的指令集合,程序能使计算机有序工作,是计算机的“软件”。机器与程序的结合,才使得单片机能实现各种各样的控制功能。 (2)汇编语言。 汇编语言是符号化的程序设计语言,是面向机器的程序设计语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址,是一种与硬件紧密相关的程序设计低级语言。 由于汇编语言以较容易识别的助记符和一定格式来表示每条指令,例如汇编语言写成的MOVA,#02”这条指令,是将立即数传送到累加器A,我们很容易识别。汇编语言提高了程序的可读性,也方便了程序设计与调试,但不能被机器识别。 (3)机器语言。 机器语言以二进制代码表示每条指令(称机器码),能直接被机器识别并执行。机器码的缺点是人工识别、记忆困难,例如:机器码“01101000000也是表示将立即数传送到累加器A。很显然,用机器语言编制的成百上千条这样的机器码,识别和记忆实在是太难了。 (4)汇编语言与机器语言的关系。 汇编语言与机器语言的关系如图3-25所示。 用汇编语言编写的程序称为源程序,源程序需要转换成相应的二进制代码(机器语言)才能写入程序存储器ROM。将源程序转换为二进制代码(机器语言)的过程称为“汇编”,机器语言表示的程序称为目的程序。 由程序员逐条将助记符表示的指令转换为机器码的过程称为人工汇编。汇编程序则相当于一个“自动翻译机器”,是承担汇编任务的程序。


2.汇编语言与高级语言。 在汇编语言之后,又发展了多种高级语言,我们较为熟悉的有 BASIC语言、C语言等。 高级语言为什么被广泛应用?有了高级语言为什么还要用汇编语言? (1)汇编语言的问题。 汇编语言与机器语言一一对应,是面向机器的低级语言。由于不同机器的指令系统不同,因此汇编语言不具备通用性和可移植性。此外,程序设计者必须对计算机的硬件和软件资源充分地了解,才有可能设计出合理、高效的程序。 (2)高级语言的特点。 高级语言是面向过程的语言,不依赖于机器,通用性和可移植性好,程序设计效率高。 用高级语言设计程序,可以不熟悉计算机的硬件结构和指令系统,设计者可把精力集中于熟悉语言的语法规则和程序的结构设计方面。高级语言是一种接近人们自然语言和常用数字表达式的计算机语言,方便设计者编程。这些就是高级语言被广泛应用的原因。 相比于汇编语言,高级语言的不足是占用的计算机空间大,运行速度也相对较慢。 3)汇编与语言与高级语言的关系。 在高级语言高度发展的今天,人们还离不开汇编语言,原因如下1)汇编语言仍是各种系统软件设计的基础语言。C语言虽也可编写系统程序,但要译成机器语言还必须用到汇编语言。 2)采用汇编语言编程,可以充分利用机器的硬件功能和结构,程序执行速度快。对于硬件资源不够充足、机器主频不是很高的单片机而言,汇编语言编程会更显其优势。 3)在计算机实时控制系统中(如中断控制、直接控制端口等),高级语言不能适应时,汇编语言不可缺少。 4)高级语言不支持的非标准过程,需要用汇编语言来补充。
3.伪指令。 伪指令是指示和控制汇编过程的命令,只对汇编程序起作用,不针对CPU,汇编后这些伪指令不产生机器码。 不同版本的汇编语言,伪指令的符号和含义会有所不同,但基本用法相同。8051单片机常用的伪指令有8种,助记符分别为:ORG、END、EQU、DATA、DB、DW、DS和BIT。 (1)起始伪指令。 起始伪指令ORG,源自英文 Origin,指令如下:
该伪指令的功能:汇编时,将该语句后的源程序所汇编成的目标代码放在16位地址或符号所指定的存储单元中。 注意:ORG一般放在源程序开头,若程序中间再次使用ORG时,其地址参数必须大于前面的,否则汇编不能通过。
(2)结束伪指令。 结束伪指令END,源自英文End,指令如下:
该伪指令的功能:汇编时,告诉汇编程序源程序至此结束,停止汇编。END后可跟第条指令的符号地址。 注意:END在源程序最末尾,且一个程序中END只能出现一次。
(3)赋值伪指令。 EQU源自英文 Equate,指令如下:
该伪指令的功能:汇编时,将右边表达式的内容赋给左边的字符名。赋值后,字符名称可以作为地址或数据在程序中使用。 注意:EQU赋值后,该字符名称在程序中不要再重复定义。且先赋值,再使用,因而该指令放在程序开始的地方。
(4)数据地址赋值伪指令。 DATA源自英文Data,指令如下:
该伪指令的功能:将数据地址或代码地址赋给左边的字符名称。 注意:DATA作用与EQU类似,但DATA通常是定义数据的地址。DATA可以先使用后定义,即该伪指令不一定要放在前面。
(5)定义字节伪指令。 DB源自英文 Define Byte,指令如下:
该伪指令的功能:在程序汇编时,将8位二进制数表存入以左边标号为起始地址的一个连续存储单元中。 注意:8位二进制数可以用二进制、十进制或十六进制表示,也可以是加引号的字符串,中间用逗号分隔。
(6)定义字伪指令。 DW源自英文 Define Word,指令如下:
该伪指令的功能:在程序汇编时,将16位二进制数表存入以左边标号为起始地址的个连续存储单元中。 注意:与DB用法相同,但每个16位二进制数要占据两个存储单元。数据的低8位存入高字节地址,数据的低8位存入低字节地址。
(7)定义存储空间伪指令。 DS源自英文 Define Storage,指令如下:
该伪指令的功能:在程序汇编时,从标号所指示的地址开始,预留一定数量的内存单。预留的空间大小由表达式确定注意:DS与DB、DW一样,只能用于程序存储器,而不能用于数据存储器。
(8)定义位伪指令。 BT源自英文Bit,指令如下:
该伪指令的功能:在程序汇编时,将位地址赋给左边的字符名称注意:只能用于有位地址的位(片内RAM和SFR块中),常用于位操作的程序中。
4.程序设计简介。 程序是指令的有序集合,一个好的程序不仅要完成规定的功能和任务,而且还应执行速度快、占用内存少、条理清晰、阅读方便、便于移植、巧妙而实用。 (1)程序设计的基本流程。 程序设计的基本流程如图3-26所示。
1)分析任务的问题。分析任务所要解决的问题,设计总体方案和算法,并抽象为数学模型,明确解题的方法与步骤。对较简单的问题,则无需建立模型等过程。 2)画出程序流程图。根据程序设计基本思路画出程序流程框图,将程序的执行过程图形化,以方便程序编写、修改、调试和交流。对简单程序可不画程序流程图。 3)编写源程序。根据程序框图中的各部分功能写出具体的程序。要注意程序的可读性和正确性,适当添加注释。 4)汇编与调试源程序。先对源程序进行汇编,汇编过程中对源程序进行修改。汇编完成后,输入数据进行程序测试,若不正确,再修改源程序再汇编、再测试,直到获得正确结果。
(2)源程序汇编过程。 源程序汇编有人工和机器两种方法,现在都采用机器汇编1)人工汇编过程。由程序员根据8051的指令集将源程序的指令逐条翻译成机器码。其过程为:第一次汇编是通过查表,将各条指令逐一翻译成机器码,并以字节为单位顺序排列;第二次汇编则是将空出的地址标号或变量用所计算出的具体地址值或偏移量替代。 2)机器汇编过程:在计算机上(联机8051单片机仿真器)通过编译程序自动进行。其过程为:第一次扫描用于检查语法错误,确定符号名字,并建立所用符号名字表,与地址或数字对应;第二次扫描则是将符号地址转换成真值,利用操作码表将助记符转换为机器码。
(3)顺序程序示例。 顺序程序的特点:程序运行时,按排列的顺序执行每条指令。每一条指令都要执行一次(有别于分支程序)也仅有一次(有别于循环程序)。 顺序程序设计举例:将两个无符号双字节数相加。设被加数存放于片内RAM的40H(高位字节)和41H(低位字节),加数存放于50H(高位字节)和51H(低位字节),和数存入40H和41H单元中。 程序流程图如图3-27所示。 根据程序流程编写程序程序如下:
(4)分支程序示例。 当有不同的条件而需要有不同的操作时,就要用分支程序来解决。分支程序的特点如图3-28所示。分支程序运行时,按不同的条件转向不的处理程序。满足条件的执行一次,通过条件转移指令实现分支控制。 分支程序设计举例:x、y均为8位二进制数,设x存入RO,y存入R1,求解:
分支的一般方法,用比较指令、数据操作指令、位检测指令等改变标志寄存器的标志位,然后用条件转移指令来判断分支。程序流程如图3-29所示。
根据程序流程图编写的分支程序如下:
(5)循环程序示例。 当某个操作需要重复进行时,就需要用到循环程序了。循环程序的特点如图3-30所示。 循环程序运行时,使某些操作重复进行,可使程序简化。重复操作部分程序(循环体)循环次数通过初值进行设置。 循环程序设计举例:控制LED信号灯循环闪烁,控制电路如图3-31所示。用单片机的P1口控制8个LED信号灯亮起和熄灭,P高电位(“1”)时LED信号灯熄灭,P1低电位(“0”)时LED信号灯亮起。 通过调用延时子程序来实现灯的亮灭间隔,程序流程如图3-32所示。
根据程序流程图设计的程序如下:
1.中断的定义。 在日常生活中经常有“中断”的事情,如图3-33所示。 将看书过程比喻为CPU执行主程序有人向你请教解题就是“中断请求”,你转去帮人解题就是“CPU响应中断请求”帮人解题过程就是“CPU执行中断服务程序”;在帮人解题过程中手机铃响就是“更高级的中断请求”,你接听电话就是“CPU响应高级中断请求”,接听电话过程就是“CPU执行高级中断服务程序”,接听电话结束继续帮人解题就是“CPU返回低级中断服务”,帮人解题结束后继续看书就是“CPU返回主程序”。 可见,所谓的计算机中断,就是CPU暂时中止其正在执行的程序,转去执行请求中断的外设或事件的服务程序,当处理完毕后再返回执行原被中断的程序,这一程序执行处理过程称为中断。单片机的中断过程可用图3-34表示。
2.中断的作用。 单片机引入中断系统,可使单片机具有分时操作、实时控制和故障处理等功能。 (1)使单片机具有分时操作功能。 只有当单片机控制的多个服务对象中的某个向CPU发出中断申请时,CPU才转去向它服务,这样,单片机就可以同时为多个对象服务,从而大大提高其工作效率。 2)使单片机可对多个对象实时控制。 实时控制是单片机的重要功能,利用中断技术,各个服务对象在需要时即可向CPU发中断申请,CPU予以及时处理,从而实现了对多个对象的实时控制。 (3)使单片机具有突发故障的处理能力。 当系统出现突然断电、存储出错、运算溢出等故障时,系统会立即发出中断请求,由CPU及时作出必要的数据转移、储存等处理,以备故障排除后恢复原程序的执行,从而提高系统的安全可靠性。
3.中断的相关名词。 (1)中断源与中断请求。 中断源:是指能发出中断请求、引起中断的装置或事件。 中断请求:就是中断源向CPU提出的处理申请,中断请求包含信号的产生、识别及消除,以确保中断的执行和恢复。 (2)中断响应、处理与返回。 中断响应:CPU暂时中断正在执行程序,转去执行中断源服务程序中断处理:执行中断源服务程序的过程即为中断处理。 中断返回:执行完中断处理程序后,再回到原程序中断处继续执行。 (3)现场保护与恢复。 现场保护:CPU转去执行中断源服务程序时,除了单片机硬件自动将断点地址(PC值)压入堆栈外,用户对工作寄存器、累加器、标志位等信息的保护。 现场恢复:执行完中断处理程序后,恢复相关寄存器中断时的信息,最后执行RET,从堆栈中自动弹出断点地址到PC,继续执行被中断的程序(4)中断优先与嵌套。 中断优先级:单片机实时控制过程中,各中断源的处理有轻重缓急之分。因此,中断系统设置中断优先级,当有多个中断请求时,CPU先响应急需的中断请求。 中断嵌套:CPU执行中断服务程序中出现优先级更高的中断请求时,会中断当前程序,转去执行优先级中断服务,处理完该中断服务后,再返回低级中断服务程序。

上一篇下一篇
参与回答(0条评论)
用户头像
上传
用户头像
{{item.nickname}}{{item.pubtime}}回复
回复图片
用户头像
上传
用户头像
{{item1.nickname}}回复 {{item1.othername}} {{item1.pubtime}} 回复
回复图片
用户头像
上传
查看全部回复{{item.replylist_count}}条 查看全部
收起回复 收起全部
{{isLoadList==1?'加载中...':(isLoadList==2&&(list.length <=3||(list.length>3&&!is_hidden))?'没有更多内容了':'查看更多回答')}}
返回顶部

返回顶部