版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 汇编语言汇编语言程序设计程序设计 4.1.1 4.1.1 单片机编程语言单片机编程语言常用的编程语言是常用的编程语言是汇编语言汇编语言和和高级语言高级语言。1 1汇编语言汇编语言用英文字符来代替机器语言,这些英文字符被称为用英文字符来代替机器语言,这些英文字符被称为助记符汇助记符汇编语言:编语言:用助记符表示的指令。用助记符表示的指令。汇编语言源程序:汇编语言源程序:用汇编语言编写的程序。用汇编语言编写的程序。“汇编汇编”:汇编语言源程序需汇编语言源程序需转换(翻译)转换(翻译)成为二进制代码成为二进制代码表示的机器语言程序,才能识别和执行。表示的机器语言程序,才能识别和执行。完
2、成完成“翻译翻译”的程序称为的程序称为汇编程序汇编程序。经汇编程序。经汇编程序“汇编汇编”得得到的以到的以“0”0”、“1”1”代码形式表示的机器语言程序称为代码形式表示的机器语言程序称为目标目标程序程序。4.1概述概述优点:优点:用汇编语言编写程序效率高,占用存储空间小,运行用汇编语言编写程序效率高,占用存储空间小,运行速度快,能编写出最优化的程序,速度快,能编写出最优化的程序,缺点:缺点:可读性差,离不开具体的硬件,是面向可读性差,离不开具体的硬件,是面向“硬件硬件”的语的语言通用性差。言通用性差。2 2高级语言高级语言不受具体不受具体“硬件硬件”的限制,的限制,优点:优点:通用性强,直观
3、、易懂、通用性强,直观、易懂、易学,可读性好。易学,可读性好。目前多数的目前多数的51单片机用户单片机用户使用使用C语言(语言(C51)来进行程序设来进行程序设计,已公认为高级语言中高效简洁而又贴近计,已公认为高级语言中高效简洁而又贴近51单片机硬件的编单片机硬件的编程语言。程语言。将将C语言向单片机上移植,始于语言向单片机上移植,始于20世纪世纪80年代的中后期。年代的中后期。经过十几年努力,经过十几年努力,C51C51已成为单片机的实用高级编程语言。已成为单片机的实用高级编程语言。尽管目前已有不少设计人员使用尽管目前已有不少设计人员使用C51C51来进行程序开发,但在来进行程序开发,但在对
4、对程序的程序的空间空间和和时间时间要求较高的场合,汇编语言仍必不可少。要求较高的场合,汇编语言仍必不可少。在这种场合下,可使用在这种场合下,可使用C C语言和汇编语言混合编程。语言和汇编语言混合编程。在很多在很多需要直接控制硬件且对实时性要求较高的场合,则更是非用需要直接控制硬件且对实时性要求较高的场合,则更是非用汇编语言不可。汇编语言不可。掌握汇编语言并能进行程序设计,是学习和掌握单片机程掌握汇编语言并能进行程序设计,是学习和掌握单片机程序设计的序设计的基本功之一基本功之一。伪指令:为了便于编程和对汇编语言程伪指令:为了便于编程和对汇编语言程序进行汇编,各种汇编程序都提供一些特殊序进行汇编,
5、各种汇编程序都提供一些特殊的指令,供人们编程使用。的指令,供人们编程使用。由伪指令确定的操作称为伪操作。由伪指令确定的操作称为伪操作。伪指令又称汇编程序控制译码指令。伪指令又称汇编程序控制译码指令。 “伪伪”体现在体现在汇编时不产生机器指令代汇编时不产生机器指令代码码,不影响程序的执行,仅指明在汇编时执,不影响程序的执行,仅指明在汇编时执行一些特殊的操作行一些特殊的操作。4.1.2 伪指令语句伪指令语句 ORG 汇编起始地址伪指令汇编起始地址伪指令指令格式为:指令格式为: ORG 表达式表达式 含义:向汇编程序说明,下述程序段的起始地含义:向汇编程序说明,下述程序段的起始地址由表达式指明。表达
6、式通常为址由表达式指明。表达式通常为16进制地址码。进制地址码。 一般规定,在由一般规定,在由ORG伪指令定位时,其地址应当伪指令定位时,其地址应当由小到大,不能重叠。由小到大,不能重叠。 它的有效范围一直到下一条它的有效范围一直到下一条ORG伪指令出现为止。伪指令出现为止。 跟在跟在ORG伪指令后面的程序段或数据段是绝对地伪指令后面的程序段或数据段是绝对地址还是浮动地址段,依赖于址还是浮动地址段,依赖于ORG右边的表达式性质。右边的表达式性质。 ORG 1000H START:MOV A,12H含义:通知汇编程序,从含义:通知汇编程序,从 START开始的程序段,开始的程序段,其起始地址由其
7、起始地址由1000H开始。由于开始。由于1000H是立即数型地址是立即数型地址码,所以还隐含地指明该程序段是绝对地址段。码,所以还隐含地指明该程序段是绝对地址段。 假定假定ORG右边的表达式是浮动程序段中定义的标号右边的表达式是浮动程序段中定义的标号RELOCA,则,则 ORG RELOCA SUBROU: 表明表明 SUBROU起始于起始于 RELOCA(它是相对地址它是相对地址)浮动地浮动地址的程序段。址的程序段。 END(END of assembly) 汇编结束伪指令汇编结束伪指令 汇编结束伪指令一般有以下两种格式:汇编结束伪指令一般有以下两种格式: 主程序模块:标号主程序模块:标号
8、END 表达式表达式 子程序模块:子程序模块: 标号标号 END 含义:通知汇编程序,该程序段汇编至此结束。含义:通知汇编程序,该程序段汇编至此结束。END语句应设置在整个程序(包括伪指令在内)的后语句应设置在整个程序(包括伪指令在内)的后面。面。当源程序为主程序时,当源程序为主程序时,END伪指令中可有标号,伪指令中可有标号,这个标号应是主程序第一条指令的符号地址。若源程这个标号应是主程序第一条指令的符号地址。若源程序为子程序,则在序为子程序,则在 END伪指令中不需要带标号。伪指令中不需要带标号。 EQU 赋值伪指令赋值伪指令 指令格式为:标号指令格式为:标号 EQU 表达式表达式 含义:
9、把表达式赋值于标号,这里的标号和表达含义:把表达式赋值于标号,这里的标号和表达式是必不可少的。例如:式是必不可少的。例如:LOOP EQU 2002H是向汇编程序表明,标号是向汇编程序表明,标号LOOP的值为的值为2002H。又如:。又如:LOOP1 EQU LOOPLOOP已赋值为已赋值为2002H,则相当于,则相当于LOOP1LOOP,即,即LOOPI也为也为2002H,在程序中,在程序中LOOP和和LOOP1可以互换使用。可以互换使用。 用用EQU语句给一个标号赋值以后,在整个源程语句给一个标号赋值以后,在整个源程序中该标号的值是固定的,不能更改。序中该标号的值是固定的,不能更改。4.
10、DB(Define Byte) 定义字节伪指令定义字节伪指令 指令格式为:标号指令格式为:标号 DB 表达式或表达式表表达式或表达式表 含义:将表达式或表达式表所表示的数据或数据串含义:将表达式或表达式表所表示的数据或数据串存入从标号开始的连续存储单元中。标号为可选项,它存入从标号开始的连续存储单元中。标号为可选项,它表示数据存储单元地址。表达式或表达式表是指一个字表示数据存储单元地址。表达式或表达式表是指一个字节或用逗号分开的字节数据。可以是用引号括起来的字节或用逗号分开的字节数据。可以是用引号括起来的字符串。字符串中的字符按符串。字符串中的字符按ASCII码存于连续的码存于连续的ROM中。
11、中。例如:例如:ORG 2000H TABLE: DB 73H,04,100,32,00,2,“ABC” 表示字节串数据存入由表示字节串数据存入由TABLE标号为起始地址的标号为起始地址的连续存储器单元中。即从连续存储器单元中。即从2000H存储单元开始依次连续存储单元开始依次连续存放数据为:存放数据为:73H,04H,64H,20H,00H,FEH,41H,42H,43H。 若不采用若不采用ORG伪指令专门规定数据区伪指令专门规定数据区的起始地址,则数据区的起始地址即根据的起始地址,则数据区的起始地址即根据DB命令前一条指令的地址确定。这时命令前一条指令的地址确定。这时DB所定义的数据字节的
12、起始地址为所定义的数据字节的起始地址为DB命令前命令前一条指令的地址加上该指令的字节数。一条指令的地址加上该指令的字节数。 5. DW(Define Word) 定义字伪指令定义字伪指令指令格式为:标号指令格式为:标号 DW 表达式或表达式表表达式或表达式表含义:把字或字串值存入由标号开始的连续存储含义:把字或字串值存入由标号开始的连续存储单元中,且把字的高字节数存入低地址单元,低字节单元中,且把字的高字节数存入低地址单元,低字节数存入高地址单元。按顺序连续存放。数存入高地址单元。按顺序连续存放。DW100H,3456H,814表示按顺序存入表示按顺序存入01H,00H,34H,56H,03H
13、,2EH注:注:DB和和DW定义的数表,数的个数不得超过定义的数表,数的个数不得超过80个。个。若数据的数目较多时,可以使用多个定义命令。若数据的数目较多时,可以使用多个定义命令。一般以一般以DB来定义数据,以来定义数据,以DW来定义地址。来定义地址。6.DS(Define Storage) 定义存储区伪指令定义存储区伪指令 指令格式为:指令格式为: DS 含义:通知汇编程序,在目标代码中,以标号为首地址保留表达含义:通知汇编程序,在目标代码中,以标号为首地址保留表达式值的若干存储单元以备源程序使用。汇编时,对这些单元不赋式值的若干存储单元以备源程序使用。汇编时,对这些单元不赋值。例如:值。例
14、如: BASE DS 100H通知汇编程序,从标号通知汇编程序,从标号BASE开始,保留开始,保留100H个存储单元,个存储单元,以备源程序另用。以备源程序另用。 注意,对于注意,对于80C51单片微机,单片微机,DB、DW、DS等伪指令只能等伪指令只能应用于应用于程序存储器程序存储器,而不能对数据存储器使用。,而不能对数据存储器使用。 7. BIT 位定义伪指令位定义伪指令 命令格式为:命令格式为: BIT 含义:给字符名称赋予位地址。其中,位地址可以是绝含义:给字符名称赋予位地址。其中,位地址可以是绝对地址,也可以是符号地址。对地址,也可以是符号地址。例:例:ABCBITP3.1把把P3.
15、1位地址赋值给位地址赋值给ABC,在后面的编程中,在后面的编程中,ABC即可即可作为位地址作为位地址P3.1使用。使用。例例1. 伪指令应用伪指令应用ORG 8100HBUFFER DS 10H DW “A B” DW 100H,1ACH,-814说明:说明: 从从8100H至至810FH为缓冲区空间为缓冲区空间 (8110H)=41H (A) (8111H)=42H (B) 8112H单元起存放单元起存放01H、00H、01H、ACH、FCH、D2H 4.2 4.2 汇编语言源程序的汇编汇编语言源程序的汇编汇编可分为汇编可分为手工汇编手工汇编和和机器汇编机器汇编两类。两类。4.2.1 4.2
16、.1 手工汇编手工汇编 通过查指令的通过查指令的机器代码表,机器代码表,逐个把助记符指令逐个把助记符指令“翻译翻译”成机器代码,再进行调试和运行。成机器代码,再进行调试和运行。 手工汇编手工汇编遇到相对转移偏移量的计算时,较麻烦,易出遇到相对转移偏移量的计算时,较麻烦,易出错,只有小程序或受条件限制时才使用。实际中,多采用错,只有小程序或受条件限制时才使用。实际中,多采用“汇汇编程序编程序”来自动完成汇编。来自动完成汇编。4.2.2 4.2.2 机器汇编机器汇编 用微型计算机上的用微型计算机上的软件软件( (汇编程序汇编程序) )来代替手工汇编。在微来代替手工汇编。在微机上用编辑软件进行源程序
17、编辑,然后生成一个机上用编辑软件进行源程序编辑,然后生成一个ASCIIASCII码文件,码文件,扩展名为扩展名为 “ “.ASM.ASM”。在微机上运行汇编程序,译成机器码。在微机上运行汇编程序,译成机器码( (后后缀为缀为.HEX.HEX或或.BIN.BIN) )。 机器码通过微机的串口(或并口)传送到用户样机(或在机器码通过微机的串口(或并口)传送到用户样机(或在线仿真器),进行程序的调试和运行。线仿真器),进行程序的调试和运行。 有时,在分析某些产品的程序的机器代码时,有时,在分析某些产品的程序的机器代码时,需将需将机器代机器代码码翻译成翻译成汇编语言源程序汇编语言源程序,称为,称为“反
18、汇编反汇编”。【例【例4-2】 表表4-1是一段源程序的汇编结果,机器码从是一段源程序的汇编结果,机器码从1000H单元开始存放单元开始存放。 4.2 4.2 汇编语言的基本设计汇编语言的基本设计 汇编语言程序设计,就是采用汇编指令来编写汇编语言程序设计,就是采用汇编指令来编写计算机程序。在实际编程中,如何正确选择指令、寻计算机程序。在实际编程中,如何正确选择指令、寻址方式和合理使用工作寄存器,包括数据存储器单元,址方式和合理使用工作寄存器,包括数据存储器单元,如何对扩展的如何对扩展的I/OI/O端口进行操作等,都是基本的汇编端口进行操作等,都是基本的汇编语言程序设计技巧。语言程序设计技巧。
19、程序编制的方法和技巧程序编制的方法和技巧 程序编制的步骤程序编制的步骤 一、预完成任务的分析一、预完成任务的分析 首先,要对单片机应用系统预完成的任务进首先,要对单片机应用系统预完成的任务进行深入的分析,明确系统的设计任务、功能要求行深入的分析,明确系统的设计任务、功能要求和技术指标。和技术指标。其次,要对系统的硬件资源和工作环境进其次,要对系统的硬件资源和工作环境进行分析。这是单片机应用系统程序设计的基础和行分析。这是单片机应用系统程序设计的基础和条件条件。二、进行算法的优化二、进行算法的优化 算法是解决具体问题的方法算法是解决具体问题的方法。一个应用系统经。一个应用系统经过分析、研究和明确
20、规定后,对应实现的功能和技过分析、研究和明确规定后,对应实现的功能和技术指标可以利用严密的数学方法或数学模型来描述,术指标可以利用严密的数学方法或数学模型来描述,从而把一个实际问题转化成由计算机进行处理的问从而把一个实际问题转化成由计算机进行处理的问题。题。同一个问题的算法可以有多种,结果也可能不同一个问题的算法可以有多种,结果也可能不尽相同,所以,应对各种算法进行分析比较,并进尽相同,所以,应对各种算法进行分析比较,并进行合理的优化。行合理的优化。三、程序总体设计及流程图绘制三、程序总体设计及流程图绘制 经过任务分析、算法优化后,就可以进经过任务分析、算法优化后,就可以进行程序的行程序的总体
21、构思总体构思,确定,确定程序的结构程序的结构和和数据数据形式,形式,并考虑并考虑资源的分配资源的分配和和参数的计算参数的计算等。等。然后根据程序运行的过程,勾画出然后根据程序运行的过程,勾画出程序执行程序执行的逻辑顺序,用图形符号将总体设计思路及的逻辑顺序,用图形符号将总体设计思路及程序流向绘制在平面图上程序流向绘制在平面图上,从而使程序的结,从而使程序的结构关系直观明了,便于检查和修改。构关系直观明了,便于检查和修改。v逻辑清晰正确的流程图是编制正确无误的应逻辑清晰正确的流程图是编制正确无误的应用程序的基础和条件。用程序的基础和条件。所以,绘制一个好的流所以,绘制一个好的流程图,是程序设计的
22、一项重要内容。程图,是程序设计的一项重要内容。v流程图可以分为流程图可以分为总流程图总流程图和和局部流程图局部流程图。总。总流程图侧重反映程序的逻辑结构和各程序模块流程图侧重反映程序的逻辑结构和各程序模块之间的相互关系。局部流程图反映程序模块的之间的相互关系。局部流程图反映程序模块的具体实施细节。对于简单的应用程序,可以不具体实施细节。对于简单的应用程序,可以不画流程图。画流程图。但是当程序较为复杂时,绘制流程但是当程序较为复杂时,绘制流程图是一个良好的编程习惯。图是一个良好的编程习惯。常用的流程图符号有:开始和结束符号、工常用的流程图符号有:开始和结束符号、工作任务符号、判断分支符号、程序连
23、接符号、作任务符号、判断分支符号、程序连接符号、程序流向符号等。程序流向符号等。 编制程序的方法和技巧编制程序的方法和技巧 一、采用模块化程序设计方法一、采用模块化程序设计方法v应用系统的程序一般由包含多个模块的主程序应用系统的程序一般由包含多个模块的主程序和各种子程序组成。和各种子程序组成。各程序模块都要完成一个各程序模块都要完成一个明确的任务,实现某个具体的功能,如:发送、明确的任务,实现某个具体的功能,如:发送、接收、延时、打印和显示等。接收、延时、打印和显示等。采用模块化的程采用模块化的程序设计方法,就是将这些不同的具体功能程序序设计方法,就是将这些不同的具体功能程序进行独立的设计和分
24、别调试,最后将这些模块进行独立的设计和分别调试,最后将这些模块程序装配成整体程序并进行联调。程序装配成整体程序并进行联调。二、尽量采用循环结构和子程序二、尽量采用循环结构和子程序 采用循环结构和子程序可以使程序的长度减少、采用循环结构和子程序可以使程序的长度减少、占用内存空间减少。占用内存空间减少。v多重循环多重循环,注意各重循环的初值和循环结束条,注意各重循环的初值和循环结束条件,避免出现件,避免出现 “ “死循环死循环”现象;现象;v通用的子程序通用的子程序,除了用于存放子程序入口参数,除了用于存放子程序入口参数的寄存器外,子程序中用到的其它寄存器的内的寄存器外,子程序中用到的其它寄存器的
25、内容应压入堆栈进行现场保护,并要特别注意堆容应压入堆栈进行现场保护,并要特别注意堆栈操作的压入和弹出的平衡;栈操作的压入和弹出的平衡;v中断处理子程序中断处理子程序除了要保护程序中用到的寄存除了要保护程序中用到的寄存器外,还应保护标志寄存器。器外,还应保护标志寄存器。程序结构一般采用以下程序结构一般采用以下3 3种基本控制结种基本控制结构,即构,即顺序结构、分支结构和循环结构顺序结构、分支结构和循环结构来组成,再加上使用广泛的来组成,再加上使用广泛的子程序子程序及及中中断服务子程序断服务子程序,共有,共有5 5种基本结构种基本结构。顺序程序是指无分支、无循环结构的程序。其执行顺序程序是指无分支
26、、无循环结构的程序。其执行流程是依指令在存储器中的存放顺序进行的。流程是依指令在存储器中的存放顺序进行的。 例例1 将片内将片内RAM 30H单元中的两位压缩单元中的两位压缩BCD码码转换成二进制数送到片内转换成二进制数送到片内RAM 40H单元中。单元中。4.2.1 4.2.1 顺序结构程序设计顺序结构程序设计 ORG 1000HSTART: MOV A, 30H ANL A, #0F0H SWAP A MOV B, #0AH MUL AB MOV R0, A MOV A, 30H ANL A, #0FH ADD A, R0 MOV 40H, A SJMP $ END 设被加数存放于片内设被
27、加数存放于片内RAMRAM的的20H20H(低位字节)、(低位字节)、21H21H(高位字节),加数存放于(高位字节),加数存放于22H22H(低位字节)和(低位字节)和23H23H(高位字节),运算结果的和数存放于(高位字节),运算结果的和数存放于20H20H(低位字(低位字节),节),21H21H,22H22H(高位字节)中。(高位字节)中。 START:PUSH ACC ;将;将A中内容进栈保护中内容进栈保护 MOV R0,20H ;将;将20H地址送地址送R0 MOV R1,22H ;将;将22H地址值送地址值送R1 MOV A,R0 ;被加数低字节内容送;被加数低字节内容送A ADD
28、 A,R1 ;低字节数相加;低字节数相加 MOV R0,A ;低字节数和存;低字节数和存20H中中例例2 无符号多字节加法无符号多字节加法。INC R0 ;指向被加数高位字节;指向被加数高位字节 INC R1 ;指向加数高位字节;指向加数高位字节 MOV A,R0 ;被加数高位字节送;被加数高位字节送A ADDC A,R1 ;高字节数带进位相加;高字节数带进位相加 MOV R0,A;高字节数和存;高字节数和存21H中中CLR AADDC A, #00HMOV 22H, A;进位暂存于;进位暂存于22H中中 POP ACC ;恢复;恢复A原内容原内容 多字节乘法的基础是加法多字节乘法的基础是加法
29、。分别相乘后对应字。分别相乘后对应字节相加节相加( (个位、十位、百位等分别相加,并考虑低字个位、十位、百位等分别相加,并考虑低字节向高字节的进位节向高字节的进位) )。选用工作寄存器暂存中间积。选用工作寄存器暂存中间积。 分析:设被乘数低字节(分析:设被乘数低字节(addrladdrl)用)用A A表示,高表示,高字节(字节(addr2addr2)用)用B B表示;乘数低字节(表示;乘数低字节(addr3addr3)用)用L L表示,高字节(表示,高字节(addr4addr4)用)用M M表示。表示。例例3 双字节无符号数乘法双字节无符号数乘法双字节相乘的过程如下:双字节相乘的过程如下:程序
30、略。程序略。对于有符号数的乘法,其原则为:对于有符号数的乘法,其原则为: 原码相乘,乘积的符号位为被乘数与乘原码相乘,乘积的符号位为被乘数与乘数符号位的数符号位的“ “ 异或异或” ” 查表:根据变量查表:根据变量x,在表格中查找对应的,在表格中查找对应的y值,使值,使yf(x)。)。y与与x的对应关系可有各种形的对应关系可有各种形式,而表格也可有各种结构。式,而表格也可有各种结构。一般表格常量设置在一般表格常量设置在程序存储器程序存储器的某一区域内。的某一区域内。MOVC AMOVC A,A ADPTRDPTR;远程查表;远程查表MOVC AMOVC A,A+PCA+PC;近程查表;近程查表
31、 例例4 查表程序查表程序 有一变量存放在片内有一变量存放在片内RAMRAM的的20H20H单元,单元,其取值范围为:其取值范围为:00H00H05H05H。要求编制。要求编制一段程序,根据变量值求其平方值,一段程序,根据变量值求其平方值,并存入片内并存入片内RAMRAM的的21H21H单元。单元。程序如下:程序如下: ORG 1000HSTART:MOV DPTR,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000HTABLE:DB 00,01,04,09,16,25 END #2000H DPTR(20H) A(A+DPTR)
32、AA 21H开始结束v在程序存储器中建立起该变量的平方表。用在程序存储器中建立起该变量的平方表。用数据指针数据指针DPTRDPTR指向平方表的首址,则变量与指向平方表的首址,则变量与数据指针之和的地址单元中的内容就是变量数据指针之和的地址单元中的内容就是变量的平方值。的平方值。vMOVC AMOVC A,A+PCA+PC指令也可以实现查表功能,指令也可以实现查表功能,且不破坏且不破坏DPTRDPTR的内容,从而可以减少保护的内容,从而可以减少保护DPTRDPTR的内容所需的开销。但表格只能存放在的内容所需的开销。但表格只能存放在MOVC AMOVC A,A+PCA+PC指令后的指令后的256B
33、256B内,即表格存内,即表格存放的地点和空间有一定限制。放的地点和空间有一定限制。 特点:程序执行流程中必然包含有条件判断,特点:程序执行流程中必然包含有条件判断,符合条件要求和不符合条件要求分别有不同的符合条件要求和不符合条件要求分别有不同的处理路径。处理路径。在程序设计时,往往借助程序框图(判断框)在程序设计时,往往借助程序框图(判断框)来指明程序的走向。来指明程序的走向。一般情况下,每个分支均需单独一段程序,在一般情况下,每个分支均需单独一段程序,在程序的起始地址赋予一个地址标号,以便当条程序的起始地址赋予一个地址标号,以便当条件满足时转向指定地址单元去执行,条件不满件满足时转向指定地
34、址单元去执行,条件不满足时仍顺序往下执行。足时仍顺序往下执行。 4.2.2 4.2.2 分支结构程序设计分支结构程序设计 单分支结构单分支结构 程序仅有两个出口,两者选一。程序仅有两个出口,两者选一。通常用条件判跳指令来选择并转移。通常用条件判跳指令来选择并转移。 可实现单分支程序转移的指令有位条件转可实现单分支程序转移的指令有位条件转移指令,如:移指令,如:JCJC、JNCJNC、JBJB、JNBJNB和和JBCJBC等,还有等,还有一些条件转移指令,如:一些条件转移指令,如:JZJZ、JNZJNZ、DJNZDJNZ等。等。 有有3 3种典型形式(见种典型形式(见图图4242)。)。图图42
35、 42 单分支结构示意图单分支结构示意图 图图42(a),当条件满足时执行分支程序),当条件满足时执行分支程序1,否则执行分支程序否则执行分支程序2。 图图42(b),当条件满足时跳过程序段),当条件满足时跳过程序段1,从程序段从程序段2开始继续顺序执行;否则,顺序执行开始继续顺序执行;否则,顺序执行程序段程序段1和程序段和程序段2。图图42(c),当条件满足时程序顺序执行),当条件满足时程序顺序执行程序段程序段2;否则,重复执行程序段;否则,重复执行程序段1,直到条件,直到条件满足为止。实际是循环结构程序。满足为止。实际是循环结构程序。Y=a2b ( (当当b10时时)Y=a2b (当当b1
36、0)转)转MMMOV R3,A;R3bMOV A,R0CLR CSUBBA, R3 ; (R1)( R0)a2-b MOV R0,AMOV A,R1SUBBA,#00HMOV R1,AMMNN:MOV 30H, R0;(31H)(30H)结果结果 MOV 31H,R1HERE:SJMP HERE 多分支选择结构多分支选择结构多分支结构:程序的判别部分有两个以上多分支结构:程序的判别部分有两个以上的出口流向。的出口流向。通常有两种形式,参见通常有两种形式,参见图图4343。分支结构程序允许嵌套即一个程序的分分支结构程序允许嵌套即一个程序的分支又由另一个分支程序所组成,从而形成多级支又由另一个分支
37、程序所组成,从而形成多级分支程序结构。分支程序结构。46 图图4-34-3 多分支选择结构1 1 图图4-34-3 多分支选择结构2 80C51设有两条多分支选择指令:设有两条多分支选择指令: 散转指令散转指令 JMP ADPTR 散转指令由数据指针散转指令由数据指针DPTR决定多分支转移程序的决定多分支转移程序的首地址,由累加器首地址,由累加器A中内容动态地选择对应的分支程序,中内容动态地选择对应的分支程序,可从多达可从多达256个分支中选一。个分支中选一。比较指令比较指令 CJNE A,direct,rel比较两个数的大小,必然存在大于、等于、小于比较两个数的大小,必然存在大于、等于、小于
38、3种情况,这时就需从种情况,这时就需从3个分支中选一。个分支中选一。简单的分支转移程序的设计,常采用简单的分支转移程序的设计,常采用逐次比较法逐次比较法,就是,就是把所有不同的情况一个一个地进行比较,发现符合就转向把所有不同的情况一个一个地进行比较,发现符合就转向对应的处理程序。对应的处理程序。缺点缺点是程序太长,有是程序太长,有n种可能的情况,种可能的情况,就需有就需有n个判断和转移。个判断和转移。【例【例4-10】 求符号函数的值。符号函数定义如下:求符号函数的值。符号函数定义如下:X存放在存放在40H单元,单元,Y存放在存放在41H单元,如图单元,如图4-3(1)所)所示。示。48Y=1
39、X 0X 0X = 00-1程序如下:程序如下:SIGNFUC: MOV A,40HCJNE A,#00H,NZEARAJMP NEGTNZEAR:JB Acc.7, POSIMOV A,#01HAJMPNEGTPOSI:MOVA,#0FFHNEGT:MOV41H, AEND49实际中,经常遇到图实际中,经常遇到图4-3(2)的分支转移程序设计,)的分支转移程序设计,典型典型例子例子就是当单片机系统中的就是当单片机系统中的键盘按下键盘按下时,就会得到一个键值,时,就会得到一个键值,根据不同的键值,跳向不同的键处理程序入口根据不同的键值,跳向不同的键处理程序入口。此时,可。此时,可用用直接转移指
40、令(直接转移指令(LJMP或或AJMP指令)组成一个转移表,指令)组成一个转移表,然然后把该单元的内容读入累加器后把该单元的内容读入累加器A,转移表首地址放入,转移表首地址放入DPTR中,再利用中,再利用散转指令散转指令实现分支转移。实现分支转移。【例【例4-11】 根据寄存器根据寄存器R2的内容,转向各个处理程序的内容,转向各个处理程序PRGX(X=0n)。)。(R2)=0,转,转PRG0(R2)=1,转,转PRG1 (R2)=n,转,转PRGn50程序如下:程序如下:JMP6:MOV DPTR,#TAB5 ;转移表首地址送;转移表首地址送DPTRMOV A,R2;分支转移参量送;分支转移参
41、量送AMOV B,#03H;乘数;乘数3送送BMUL AB ;分支转移参量乘;分支转移参量乘3MOV R6, A;乘积的低;乘积的低8位暂存位暂存R6MOV A,B ;乘积的高;乘积的高8位送位送AADD A ,DPH ;乘积的高;乘积的高8位加到位加到DPH中中MOV DPH, A MOV A, R6JMP A+DPTR;多分支转移选择;多分支转移选择 51TAB5: LJMP PRG0;多分支转移表;多分支转移表 LJMP PRG1 LJMP PRGnR2中的中的分支转移参量乘分支转移参量乘3是由于长跳转指令是由于长跳转指令LJMP要占要占3个单元。本例程序可位于个单元。本例程序可位于64
42、KB程序程序存储器空间的任何区域。存储器空间的任何区域。52 循环:强制循环:强制CPUCPU重复多次地执行一串指令的重复多次地执行一串指令的基本程序结构。基本程序结构。 循环程序结构是分支程序中的一个特殊形式。循环程序结构是分支程序中的一个特殊形式。计数循环结构如计数循环结构如图图4444所示,所示,条件循环结构如条件循环结构如图图4-54-5所示。所示。4.2.3 4.2.3 循环循环结构程序设计结构程序设计 循环程序的循环程序的4 4个部分个部分(1 1)循环初始化循环初始化在进入循环程序体之前所必要的准备工在进入循环程序体之前所必要的准备工作:需给用于循环过程的工作单元设置初值,作:需
43、给用于循环过程的工作单元设置初值,如如循环控制计数初值的设置、地址指针的起始循环控制计数初值的设置、地址指针的起始地址的设置、为变量预置初值地址的设置、为变量预置初值等,有些情况下等,有些情况下还要进行现场保护。还要进行现场保护。 (2 2)循环体循环体 循环结构程序的核心部分,完成循环结构程序的核心部分,完成实际的处理工作,是需反复循环执行实际的处理工作,是需反复循环执行的部分。的部分。(3 3)循环控制循环控制 控制循环程序的循环与结束部分,通过循环变控制循环程序的循环与结束部分,通过循环变量和结束条件进行控制。在重复执行循环体的过程中,量和结束条件进行控制。在重复执行循环体的过程中,不断
44、修改循环变量,直到符合结束条件,就结束循环不断修改循环变量,直到符合结束条件,就结束循环程序的执行。在循环过程中,除不断修改循环变量外,程序的执行。在循环过程中,除不断修改循环变量外,还需修改地址指针等有关参数。还需修改地址指针等有关参数。实现方法主要有循环计数控制法和条件控制法。实现方法主要有循环计数控制法和条件控制法。循环次数不确定的情况:满足条件就结束循环。采循环次数不确定的情况:满足条件就结束循环。采用条件控制法。用条件控制法。循环次数己知的情况:采用计数控制法。循环次数己知的情况:采用计数控制法。 (4) (4) 结束结束部分部分 对循环程序执行的结果进行分析、处理和存放。对循环程序
45、执行的结果进行分析、处理和存放。有些情况下需恢复现场。有些情况下需恢复现场。图图4444是计数循环结构形式。主机对循环程序的初是计数循环结构形式。主机对循环程序的初始化和结束部分均只执行一次,而对循环体和循环控始化和结束部分均只执行一次,而对循环体和循环控制部分则常需重复执行多次,不管条件如何,它至少制部分则常需重复执行多次,不管条件如何,它至少执行一次循环体循环程序设计的重点。执行一次循环体循环程序设计的重点。图图4545是条件循环结构形式。条件循环先检查控制是条件循环结构形式。条件循环先检查控制条件是否成立,决定循环程序是否执行。条件是否成立,决定循环程序是否执行。 计数控制循环结构计数控
46、制循环结构计数循环程序的特点是循环次数已知,必须在初计数循环程序的特点是循环次数已知,必须在初始化部分设定计数的初值,循环控制部分依据计始化部分设定计数的初值,循环控制部分依据计数器的值决定循环次数。一般均设置为减数器的值决定循环次数。一般均设置为减“1”1”计数器,每循环一次自动减计数器,每循环一次自动减“1”1”,直到回,直到回0 0时结时结束循环。束循环。 DJNZ Rn,rel ;以工作寄存器作控制计数器;以工作寄存器作控制计数器DJNZ direct,rel ;以直接寻址单元作控制计数器;以直接寻址单元作控制计数器 【例】设【例】设XiXi均为单字节数,并按顺序存放在以均为单字节数,
47、并按顺序存放在以50H50H为首地址的内为首地址的内RAMRAM存储单元中,数据长度存储单元中,数据长度(个数)(个数)N N存在存在R2R2中,试编程求和中,试编程求和S=X1+X2+XNS=X1+X2+XN,并将,并将S S(双字节)存放在(双字节)存放在R3R4R3R4中,(设中,(设S S6553665536)。)。解:程序如下:解:程序如下: SXN: MOV R2,#NSXN: MOV R2,#N;置数据长度置数据长度( (循环次数循环次数) ) MOV R3,#00H MOV R3,#00H ;和单元和单元( (高高8 8位位) )清清0 0 MOV R4,#00H MOV R4
48、,#00H ;和单元和单元( (低低8 8位位) )清清0 0 MOV R0,#50HMOV R0,#50H ;求和数据区首址求和数据区首址LOOP:MOV A,R4LOOP:MOV A,R4;读前次低读前次低8 8位和位和 ADD A,R0ADD A,R0;低低8 8位累加位累加 MOV R4,AMOV R4,A;存低存低8 8位和位和 CLR A CLR A ; ADDC A,R3 ADDC A,R3 ;高高8 8位加进位位加进位 MOV R3,A MOV R3,A ;存高存高8 8位和位和 INC R0 INC R0 ;指向下一数据指向下一数据 DJNZ R2,LOOP DJNZ R2,
49、LOOP ;判判N N个数据累加完否?个数据累加完否? RET RET ;退出循环退出循环有些情况可以不采用单片微机内的定时器有些情况可以不采用单片微机内的定时器/ /计数器计数器作定时,而是采用软件延时的办法,执行一段循环程序,作定时,而是采用软件延时的办法,执行一段循环程序,而循环程序执行的时间即为延时时间。而循环程序执行的时间即为延时时间。DELAY: MOV R2, data ;预置计数循环控制常数;预置计数循环控制常数DELAY1:DJNZ R2,DELAY1 ; 当(当(R2)0,转向本身,转向本身 RET 根据根据R2R2的不同初值的不同初值(0 (0 FFH)FFH),可实现,
50、可实现5 5515515个机个机器周期的延时。器周期的延时。 例例. 软件延时软件延时 设设80C5180C51单片机的单片机的P1P1口作为输出口,经驱动电口作为输出口,经驱动电路路74LS240(874LS240(8反相三态缓冲反相三态缓冲/ /驱动器驱动器) )接接8 8只发只发光二极管,如图光二极管,如图4-84-8所示。试编程实现:每个所示。试编程实现:每个灯闪烁点亮灯闪烁点亮1010次,再转移到下一个灯闪烁点次,再转移到下一个灯闪烁点亮亮1010次,循环不止。次,循环不止。 【例】【例】 编制一个循环闪烁灯的程序编制一个循环闪烁灯的程序。FLASH:MOV A,#01HFLASH:
51、MOV A,#01H ; ;置灯亮初值置灯亮初值FSH0: MOV R2,#0AHFSH0: MOV R2,#0AH; ;置闪烁次数置闪烁次数FLOP: MOV P1,AFLOP: MOV P1,A; ;点亮点亮 LCALL DY1sLCALL DY1s; ;延时延时1s1s MOV P1,#00H MOV P1,#00H; ;熄灭熄灭 LCALL DY1sLCALL DY1s; ;延时延时1s1s DJNZ R2,FLOP DJNZ R2,FLOP; ;闪烁闪烁1010次次 RLRL A A; ;左移一位左移一位 SJMP FSH0SJMP FSH0; ;循环循环 RETRET; ;解:程序
52、如下:解:程序如下:延时子程序可根据延时长短,自行编写。延时子程序可根据延时长短,自行编写。 条件控制循环结构条件控制循环结构 根据控制循环结束的条件,决定是否继续循根据控制循环结束的条件,决定是否继续循环程序的执行。所谓的结束条件可以是搜索到某环程序的执行。所谓的结束条件可以是搜索到某个参数个参数( (比如回车符比如回车符“CR”)CR”),也可以是发生的某,也可以是发生的某种变化种变化( (如故障引起电路电平变化如故障引起电路电平变化) ) 等,什么时侯等,什么时侯结束循环是不可预知的。结束循环是不可预知的。一般常用比较转移指令或条件判跳指一般常用比较转移指令或条件判跳指令进行控制和实现令
53、进行控制和实现。 例:把内部例:把内部RAMRAM中起始地址为中起始地址为DATADATA的数据串传送到外部的数据串传送到外部RAMRAM以以BUFFERBUFFER为首地址的区域,直到发现为首地址的区域,直到发现“$”$”字符的字符的ASCIIASCII码为止,数据串的最大长度在内存码为止,数据串的最大长度在内存20H20H中。中。 MOV R0,#DATA;内数据区首地址;内数据区首地址 MOV DPTR,#BUFFER;外数据区首地址;外数据区首地址LOOP:CJNE R0 ,#24H ,LOOP2 ;判是否为;判是否为“$”符符(24H) SJMPLOOP1;是;是“$”符,则结束符,
54、则结束LOOP2:MOV A,R0;不是;不是“$”符,则传送符,则传送 MOVX DPTR,A INC R0 INC DPTR DJNZ 20H,LOOP;数据串未查完,继续;数据串未查完,继续LOOP1: 注:注:一个是条件循环控制,以找到一个是条件循环控制,以找到ASCII码码“$”符为循环结束条件;符为循环结束条件;笫二个是计数循环结构,万一找不到笫二个是计数循环结构,万一找不到ASCII码码“$”符,则由数据串的最大符,则由数据串的最大长度作为计数循环控制。长度作为计数循环控制。 4.2.4 4.2.4 子程序及其调用子程序及其调用 将那些需多次应用的、完成相同的某种基本运将那些需多
55、次应用的、完成相同的某种基本运算或操作的程序段从整个程序中独立出来,单独算或操作的程序段从整个程序中独立出来,单独编成一个程序段,需要时进行调用。这样的程序编成一个程序段,需要时进行调用。这样的程序段称为段称为子程序子程序。 优点:采用子程序可使程序结构简单,缩短程优点:采用子程序可使程序结构简单,缩短程序的设计时间,减少占用的程序存储空间。序的设计时间,减少占用的程序存储空间。 子程序在程序设计中非常重要,应熟练掌握子子程序在程序设计中非常重要,应熟练掌握子程序的设计方法。程序的设计方法。1 1子程序的设计原则和应注意的问题子程序的设计原则和应注意的问题 (1 1)子程序的入口地址,前必须有
56、标号。)子程序的入口地址,前必须有标号。 (2 2)主程序调用子程序,是通过调用指令来实现。有)主程序调用子程序,是通过调用指令来实现。有两两条子程序调用指令条子程序调用指令: 绝对调用指令绝对调用指令ACALL addr11ACALL addr11。双字节,。双字节,addr11addr11指出了指出了调用的目的地址,调用的目的地址,PCPC中中1616位地址中的高位地址中的高5 5位不变,被调用的位不变,被调用的子程序的首地址与绝对调用指令的下一条指令的高子程序的首地址与绝对调用指令的下一条指令的高5 5位地址位地址相同,即只能在同一个相同,即只能在同一个2KB2KB区内。区内。 长调用指
57、令长调用指令LCALL addr16LCALL addr16。三字节,三字节,addr16addr16为直接调为直接调用的目的地址,子程序可放在用的目的地址,子程序可放在64KB64KB程序存储器区任意位置。程序存储器区任意位置。(3 3)子程序结构中必须用到)子程序结构中必须用到堆栈堆栈,用来进行断点和现场的,用来进行断点和现场的保护。保护。(4 4)子程序返回主程序时,)子程序返回主程序时,最后一条指令必须是最后一条指令必须是RETRET指令指令,功能是把功能是把堆栈中的断点地址堆栈中的断点地址弹出送入弹出送入PCPC指针中,从而实现子程指针中,从而实现子程序返回后从主程序断点处继续执行主
58、程序。序返回后从主程序断点处继续执行主程序。(5 5)子程序可以)子程序可以嵌套嵌套,即主程序可以调用子程序,子程序,即主程序可以调用子程序,子程序又可以调用另外的子程序。又可以调用另外的子程序。2子程序的基本结构子程序的基本结构典型的子程序的基本结构如下:典型的子程序的基本结构如下:MAIN: ;MAIN为主程序入口标号为主程序入口标号LCALL SUB;调用子程序;调用子程序SUB 子程序子程序SUB:PUSH PSW;现场保护;现场保护 PUSH AccPOP Acc ;现场恢复,注意要先进后出;现场恢复,注意要先进后出POP PSW RET;最后一条指令必须为;最后一条指令必须为RET
59、子程序处理程序段子程序处理程序段子程序子程序4.2.5 数据排序程序设计数据排序程序设计将一批数由小到大(将一批数由小到大(升序升序)排列,或由大到小()排列,或由大到小(降序降序)排)排列。列。最常用的数据排序算法是最常用的数据排序算法是冒泡法冒泡法,是相邻数互换的排序方,是相邻数互换的排序方法,因其过程类似水中气泡上浮,故称冒泡法。法,因其过程类似水中气泡上浮,故称冒泡法。排序时,排序时,从前向后进行相邻两个数的比较从前向后进行相邻两个数的比较,如果,如果数据的大数据的大小次序小次序与与要求的顺序不符时要求的顺序不符时,就将,就将两个数互换两个数互换;否则,顺序;否则,顺序符合要求就不互换
60、。如果进行符合要求就不互换。如果进行升序排序升序排序,应通过这种相邻数,应通过这种相邻数互换方法,使互换方法,使小数向前移小数向前移,大数向后移大数向后移。如此从前向后进行一次次如此从前向后进行一次次相邻数互换相邻数互换(冒泡),(冒泡),就会把这就会把这批数据的最大数排到最后,次大数排在倒数第二的位置,从批数据的最大数排到最后,次大数排在倒数第二的位置,从而实现一批数据由小到大的排列。而实现一批数据由小到大的排列。 假设有假设有7个原始数据的排列顺序为个原始数据的排列顺序为6、4、1、2、5、7、3。第一次冒泡的过程是:。第一次冒泡的过程是:6、4、1、2、5、7、3 ;原始数据的排列;原始
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年深圳市第二高级中学深汕实验学校届赴外招聘教师笔试真题
- 2023年聊城市人民医院招聘备案制工作人员考试真题
- 2023年嘉兴海盐县卫生健康系统招聘应届护理人员笔试真题
- 2023年国家海洋环境监测中心事业编制人员招聘笔试真题
- 2023年崇左市天等县人民医院招聘考试真题
- 病毒专题疫苗研究报告
- 班级生日会策划方案
- 玻尿酸锁水研究报告
- 版纳轻钢房屋施工方案
- 无碳复写纸微胶囊(无碳复写纸发色剂)相关行业投资规划报告
- 巡察流程培训课件
- 学校级绿色教育存在的问题与改革策略
- 检察机关保密知识讲座
- 产品市场推广效果报告
- 2024电力企业数据资源编码规范
- Java程序设计项目式教程 教案 单元10 Java图形用户界面设计
- 【小学心理健康教育分析国内外文献综述4100字】
- 高考复习递推思维方法在物理高考题中的应用
- 枪械介绍课件
- 信用证条款编号和中英文对照
- 电脑供货方案、售后服务方案
评论
0/150
提交评论