《04第四章课件(汇编语言程序设计).ppt》由会员分享,可在线阅读,更多相关《04第四章课件(汇编语言程序设计).ppt(69页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、14.1 程序编制的方法和技巧程序编制的方法和技巧.2本章分为四节,主要介绍:本章分为四节,主要介绍:4.3 基本程序结构基本程序结构.264.2 源程序的编辑和汇编源程序的编辑和汇编.13 4.4 常用程序举例常用程序举例.5524.1 程序编制的方法和技巧程序编制的方法和技巧 4.1.14.1.1程序程序编编制的步制的步骤骤一、任务分析一、任务分析 首先,要对单片机应用系统要完成的任首先,要对单片机应用系统要完成的任务进行深入的分析,明确系统的务进行深入的分析,明确系统的设计任务、设计任务、功能要求和技术指标。功能要求和技术指标。其次,要对系统的其次,要对系统的硬件资源硬件资源和和工作环境
2、工作环境进行分析。这是单片进行分析。这是单片机应用系统程序设计的基础和条件。机应用系统程序设计的基础和条件。3二、进行算法的优化二、进行算法的优化 算法是解决具体问题的方法算法是解决具体问题的方法。应用系统经过分析、。应用系统经过分析、研究和明确规定后,对应实现的功能和技术指标可研究和明确规定后,对应实现的功能和技术指标可以利用严密的数学方法或数学模型来描述,从而把以利用严密的数学方法或数学模型来描述,从而把实际问题转化成由计算机进行处理的问题。实际问题转化成由计算机进行处理的问题。同一个问题的算法可以有多种,结果也可能不尽同一个问题的算法可以有多种,结果也可能不尽相同,所以,应对各种算法进行
3、分析比较,并进行相同,所以,应对各种算法进行分析比较,并进行合理的优化。合理的优化。比如,用迭代法解微分方程,需要考比如,用迭代法解微分方程,需要考虑收敛速度的快慢(即在一定的时间里能否达到精虑收敛速度的快慢(即在一定的时间里能否达到精度要求)。而有的问题则受内存容量的限制而对时度要求)。而有的问题则受内存容量的限制而对时间要求并不苛刻。对于后一种情况,速度不快但节间要求并不苛刻。对于后一种情况,速度不快但节省内存的算法则应是首选。省内存的算法则应是首选。4三、程序总体设计及流程图绘制三、程序总体设计及流程图绘制 经过任务分析、算法优化后,就可以进经过任务分析、算法优化后,就可以进行程序的行程
4、序的总体构思总体构思,确定,确定程序的结构程序的结构和和数数据形式,据形式,并考虑并考虑资源的分配资源的分配和和参数的计算参数的计算等。然后根据程序运行的过程,勾画出等。然后根据程序运行的过程,勾画出程程序执行的逻辑顺序,用图形符号将总体设序执行的逻辑顺序,用图形符号将总体设计思路及程序流向绘制在平面图上计思路及程序流向绘制在平面图上,从而,从而使程序的结构关系直观明了,便于检查和使程序的结构关系直观明了,便于检查和修改。修改。5清晰正确的流程图是编制正确无误的应用程清晰正确的流程图是编制正确无误的应用程序的基础和条件。所以,绘制一个好的流程序的基础和条件。所以,绘制一个好的流程图,是程序设计
5、的一项重要内容。图,是程序设计的一项重要内容。流程图可以分为流程图可以分为总流程图总流程图和和局部流程图局部流程图。总。总流程图侧重反映程序的逻辑结构和各程序模流程图侧重反映程序的逻辑结构和各程序模块之间的相互关系。局部流程图反映程序模块之间的相互关系。局部流程图反映程序模块的具体实施细节。对于简单的应用程序,块的具体实施细节。对于简单的应用程序,可以不画流程图。可以不画流程图。但是当程序较为复杂时,但是当程序较为复杂时,绘制流程图是一个良好的编程习惯。绘制流程图是一个良好的编程习惯。6常用的流程图符号有:开始和结束符号、工常用的流程图符号有:开始和结束符号、工作任务符号、判断分支符号、程序连
6、接符号、作任务符号、判断分支符号、程序连接符号、程序流向符号等程序流向符号等 74.1.2 4.1.2 编编制程序的方法和技巧制程序的方法和技巧一、采用模块化程序设计方法一、采用模块化程序设计方法 应应用用系系统统的的程程序序由由包包含含多多个个模模块块的的主主程程序序和和各各种种子子程程序序组组成成。各各程程序序模模块块都都要要完完成成一一个个明明确确的的任任务务,实实现现某某个个具具体体的的功功能能,如如:数数据据采采集集、数数据据处处理理、发送、接收、延时、打印和显示等。发送、接收、延时、打印和显示等。模模块块化化的的程程序序设设计计方方法法具具有有明明显显的的优优点点。把把一一个个多多
7、功功能能的的复复杂杂的的程程序序划划分分为为若若干干个个简简单单的的、功功能能单单一一的的程程序序模模块块,有有利利于于程程序序的的设设计计和和调调试试,有有利利于于程程序序的的优优化化和和分分工工,提提高高了了程程序序的的阅阅读读性性和和可可靠靠性性,使程序的结构层次一目了然。使程序的结构层次一目了然。8二、尽量采用循环结构和子程序二、尽量采用循环结构和子程序 采用循环结构和子程序可以使程序的长度采用循环结构和子程序可以使程序的长度减少、占用内存空间减少。减少、占用内存空间减少。多重循环多重循环,注意各重循环的初值和循环结束条件,注意各重循环的初值和循环结束条件,避免出现避免出现“死循环死循
8、环”现象;现象;通用的子程序通用的子程序,除了用于存放子程序入口参数的,除了用于存放子程序入口参数的寄存器外,子程序中用到的其它寄存器的内容应寄存器外,子程序中用到的其它寄存器的内容应压入堆栈进行现场保护,并要特别注意堆栈操作压入堆栈进行现场保护,并要特别注意堆栈操作的压入和弹出的平衡;的压入和弹出的平衡;中断处理子程序中断处理子程序除了要保护程序中用到的除了要保护程序中用到的寄存器外,还应保护标志寄存器。寄存器外,还应保护标志寄存器。94.1.3 4.1.3 汇编语汇编语言的言的语语句格式句格式语语句行由四个字段句行由四个字段组组成成 :标标号:号:操作操作码码 操作数操作数 ;注;注释释
9、括号内的部分可以根据括号内的部分可以根据实际实际情况取舍。每个情况取舍。每个字段之字段之间间要用分隔符分隔,可以用作分隔符的要用分隔符分隔,可以用作分隔符的符号有空格、冒号、逗号、分号等。符号有空格、冒号、逗号、分号等。如:如:LOOPLOOP:MOV AMOV A,#7FH#7FH;A7FHA7FH10一、标号一、标号 标号标号是语句地址的标志符号是语句地址的标志符号,用于引导对该语句的,用于引导对该语句的非顺序访问。非顺序访问。有关标号的规定有关标号的规定为:为:二、操作码二、操作码 操作码用于操作码用于规定语句执行的操作规定语句执行的操作。它是汇编语句中。它是汇编语句中唯一不能空缺的部分
10、。它由指令助记符表示。唯一不能空缺的部分。它由指令助记符表示。由由18个个ASCII字符组成。字符组成。第一个字符必须是字母第一个字符必须是字母,其余字符可以是字母、数字或其他特定字符;其余字符可以是字母、数字或其他特定字符;不能使用已经定义了的符号作为标号。如指令助记不能使用已经定义了的符号作为标号。如指令助记符、寄存器符号名称等;符、寄存器符号名称等;后边必须跟冒号。后边必须跟冒号。11三、操作数三、操作数 操作数用于给指令的操作操作数用于给指令的操作提供数据提供数据或或地址地址。在一。在一条汇编语句中操作数可能是空缺的,也可能包括一条汇编语句中操作数可能是空缺的,也可能包括一项,还可能包
11、括两项或三项。各操作数间以逗号分项,还可能包括两项或三项。各操作数间以逗号分隔。操作数字段的内容可能包括以下几种情况:隔。操作数字段的内容可能包括以下几种情况:(1)工作寄存器名;)工作寄存器名;(2)特殊功能寄存器名;)特殊功能寄存器名;(3)标号名;)标号名;(4)常数;)常数;(5)符号)符号“$”,表示程序计数器,表示程序计数器PC的当前值;的当前值;(6)表达式。)表达式。12四、注释四、注释 注释只是对语句的说明注释只是对语句的说明。注释字段可以增加程序的。注释字段可以增加程序的可读性,有助于编程人员的阅读和维护。注释字段必须可读性,有助于编程人员的阅读和维护。注释字段必须以分号以
12、分号“;”开头,长度不限,当一行书写不下时,可开头,长度不限,当一行书写不下时,可以换行接着书写,但换行时应注意要在开头使用分号以换行接着书写,但换行时应注意要在开头使用分号“;”。五、数据的表示形式五、数据的表示形式数据数据可以有以下几种表示形式:可以有以下几种表示形式:二进制数,末尾以字母二进制数,末尾以字母 B 标识。如:标识。如:1000 1111B;十进制数,末尾以字母十进制数,末尾以字母 D 标识或将字母标识或将字母D省略。如:省略。如:88D,66;十六进制数,末尾以字母十六进制数,末尾以字母 H 标识。如:标识。如:78H,0A8H(但应注意的是,(但应注意的是,十六进制数以字
13、母十六进制数以字母AF开头时应在其前面加上数字开头时应在其前面加上数字“0”。);。);ASCII码码,以单引号括起来标识。如:,以单引号括起来标识。如:AB,1245 134.2 源程序的源程序的编辑编辑和和汇编汇编 一、源程序的编辑一、源程序的编辑 源程序的编写要依据源程序的编写要依据80C51汇编语言的基本规则,汇编语言的基本规则,特别要用好常用的汇编命令(即伪指令),例如下特别要用好常用的汇编命令(即伪指令),例如下面的程序段:面的程序段:ORG 0040H MOV A,#7FH MOV R1,#44H END 这里的这里的ORG和和END是两条伪指令,其作用是告诉是两条伪指令,其作用
14、是告诉汇编程序此汇编源程序的起止位置。编辑好的源程汇编程序此汇编源程序的起止位置。编辑好的源程序应以序应以“.ASM”扩展名存盘,以备汇编程序调用。扩展名存盘,以备汇编程序调用。4.2.1 4.2.1 源程序的源程序的编辑编辑与与汇编汇编14二、源程序的汇编二、源程序的汇编 将汇编语言源程序转换为单片机能执行的机器码形将汇编语言源程序转换为单片机能执行的机器码形式的目标程序的过程叫汇编式的目标程序的过程叫汇编。常用的方法有两种:。常用的方法有两种:手工汇编手工汇编时,把程序用助记符指令写出后,通过手工时,把程序用助记符指令写出后,通过手工方式查指令编码表,逐个把助记符指令翻译成机器码,方式查指
15、令编码表,逐个把助记符指令翻译成机器码,然后把得到的机器码程序(以十六进制形式)键入到然后把得到的机器码程序(以十六进制形式)键入到单片机开发机中,并进行调试。单片机开发机中,并进行调试。机器汇编机器汇编是在常用的个人计算机是在常用的个人计算机PC上,使用交叉汇上,使用交叉汇编程序将汇编语言源程序转换为机器码形式的目标程编程序将汇编语言源程序转换为机器码形式的目标程序。生成的目标程序由序。生成的目标程序由PC机传送到开发机上,经调试机传送到开发机上,经调试无误后,再固化到单片机的程序存储器无误后,再固化到单片机的程序存储器ROM中。中。15 源程序经过机器汇编后,形成的若干文件源程序经过机器汇
16、编后,形成的若干文件中含有两个主要文件,中含有两个主要文件,一是列表文件一是列表文件,另一个另一个是目标码文件是目标码文件。因汇编软件的不同,文件的格。因汇编软件的不同,文件的格式及信息会有一些不同。但主要信息如下:式及信息会有一些不同。但主要信息如下:列表文件:列表文件:地地 址址 目标码目标码 汇编程序汇编程序 ORG 0040H0040H 747F MOV A,#7FH0042H 7944 MOV R1,#44H END目标码文件:目标码文件:首地址首地址 末地址末地址 目标码目标码0040H 0044H 747F794416 伪指令伪指令是汇编程序能够识别并对汇编过程进行是汇编程序能够
17、识别并对汇编过程进行某种控制的汇编命令。它不是单片机执行的指令,某种控制的汇编命令。它不是单片机执行的指令,所以没有对应的可执行目标码,汇编后产生的目所以没有对应的可执行目标码,汇编后产生的目标程序中不会再出现伪指令。标程序中不会再出现伪指令。4.2.2 4.2.2 伪伪指令指令一、起始地址设定伪指令一、起始地址设定伪指令 ORG格式为:格式为:ORG 表达式表达式 该指令的该指令的功能功能是向汇编程序说明下面紧接的程是向汇编程序说明下面紧接的程序段或数据段存放的起始地址。表达式通常为序段或数据段存放的起始地址。表达式通常为16进制地址,也可以是已定义的标号地址。进制地址,也可以是已定义的标号
18、地址。17 ORG 8000HSTART:MOV A,#30H 此时规定该段程序的机器码从地址此时规定该段程序的机器码从地址8000H单元单元开始存放。开始存放。在每一个汇编语言源程序的开始,在每一个汇编语言源程序的开始,都要设置一条都要设置一条ORG伪指令来指定该程序在存储器中存放的起始位伪指令来指定该程序在存储器中存放的起始位置。置。若省略若省略ORG伪指令,则该程序段从伪指令,则该程序段从0000H单元单元开始存放。在一个源程序中,开始存放。在一个源程序中,可以多次使用可以多次使用ORG伪伪指令规定不同程序段或数据段存放的起始地址,但指令规定不同程序段或数据段存放的起始地址,但要求地址值
19、由小到大依序排列要求地址值由小到大依序排列,不允许空间重叠。,不允许空间重叠。18二、汇编结束伪指令二、汇编结束伪指令 END格式为:格式为:END 该指令的该指令的功能功能是结束汇编。是结束汇编。汇编程序遇到汇编程序遇到END伪指令后即结束汇编。伪指令后即结束汇编。处于处于END之后的程序,汇编程序将不处理。之后的程序,汇编程序将不处理。19三、字节数据定义伪指令三、字节数据定义伪指令 DB 标号:标号:DB 字节数据表字节数据表 功能功能是从标号指定的地址开始,在是从标号指定的地址开始,在ROM中定义中定义字节数据。该伪指令将字节数据表中的数据根据从字节数据。该伪指令将字节数据表中的数据根
20、据从左到右的顺序依次存放在指定的存储单元中。一个左到右的顺序依次存放在指定的存储单元中。一个数据占一个存储单元。例如:数据占一个存储单元。例如:DB “how are you?”把字符串中的字符以把字符串中的字符以ASCII码的形式存放在连续的码的形式存放在连续的ROM单元中。又如:单元中。又如:DB -2,-4,-6,8,10,18把把6个数转换为十六进制表示(个数转换为十六进制表示(FEH,FCH,FAH,08H,0AH,12H),并连续地存放在),并连续地存放在6个个ROM。20 该伪指令常用于存放数据表格。如要存放该伪指令常用于存放数据表格。如要存放显示用的十六进制的字形码,可以用多条
21、显示用的十六进制的字形码,可以用多条DB指令完成:指令完成:DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H DB C6H,A1H,86H,84H21四、字数据定义伪指令四、字数据定义伪指令 DW 标号:标号:DW 字数据表字数据表 功能功能是从标号指定的地址单元开始,在程序存储是从标号指定的地址单元开始,在程序存储器中定义字数据。该伪指令将字或字表中的数据根器中定义字数据。该伪指令将字或字表中的数据根据从左到右的顺序依次存放在指定的存储单元中。据从左到右的顺序依次存放在指定的存储单元中。应特别注意:应特别注意:16位的
22、二进制数,高位的二进制数,高8位存放在低地址位存放在低地址单元,低单元,低8位存放在高地址单元。例如:位存放在高地址单元。例如:ORG 1400HDATA:DW 324AH,3CH 汇编后,(汇编后,(1400H)=32H,(,(1401H)=4AH,(1402H)=00H,(,(1403H)=3CH。22五、空间定义伪指令五、空间定义伪指令 DS 标号:标号:DS 表达式表达式 功能功能是从标号指定的地址单元开始,在程序存储是从标号指定的地址单元开始,在程序存储器中保留由表达式所指定的个数的存储单元作为备器中保留由表达式所指定的个数的存储单元作为备用的空间,并都填以零值。例如:用的空间,并都
23、填以零值。例如:ORG 3000HBUF:DS 50 汇编后,从地址汇编后,从地址3000H开始保留开始保留50个存储个存储单元作为备用单元单元作为备用单元。23六、赋值伪指令六、赋值伪指令 EQU符号名符号名 EQU 表达式表达式 功能功能是将表达式的值或特定的某个汇是将表达式的值或特定的某个汇编符号定义为一个指定的符号名。例如:编符号定义为一个指定的符号名。例如:24LEN EQU 10SUM EQU 21HBLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCKLOOP:ADD A,R0 INC R0 DJNZ R7,LOOP MOV SUM,A END 该
24、程序的功能是,把BLOCK单元开始存放的10个无符号数进行求和,并将结果存入SUM单元中。25七、位地址符号定义伪指令七、位地址符号定义伪指令 BIT格式为:格式为:符号名符号名 BIT 位地址表达式位地址表达式 功能功能是将位地址赋给指定的符号名。其中,是将位地址赋给指定的符号名。其中,位地址表达式可以是绝对地址,也可以是符号位地址表达式可以是绝对地址,也可以是符号地址。地址。例如:例如:ST BIT P1.0将将P1.0的位地址赋给符号名的位地址赋给符号名ST,在其后的编,在其后的编程中就可以用程中就可以用ST来代替来代替P1.0。264.3 基本程序基本程序结结构构 4.3.1 顺序程序
25、顺序程序 顺序程序是指无分支、无循环结构的程序。其执行流程是顺序程序是指无分支、无循环结构的程序。其执行流程是依指令在存储器中的存放顺序进行的。依指令在存储器中的存放顺序进行的。一、数据传送一、数据传送 例例 内部内部RAM的的2AH2EH单元中存储的数据如图所示。单元中存储的数据如图所示。试编写程序实现图示的数据传送结果。试编写程序实现图示的数据传送结果。27方法一:方法一:MOV A,2EH ;2字节,字节,1个机器周期个机器周期MOV 2EH,2DH ;3字节,字节,2个机器周期个机器周期MOV 2DH,2CH ;3字节,字节,2个机器周期个机器周期MOV 2CH,2BH ;3字节,字节
26、,2个机器周期个机器周期MOV 2BH,#00H;3字节,字节,2个机器周期个机器周期28方法二:方法二:CLR A ;1字节,字节,1个机器周期个机器周期XCH A,2BH ;2字节,字节,1个机器周期个机器周期XCH A,2CH ;2字节,字节,1个机器周期个机器周期XCH A,2DH ;2字节,字节,1个机器周期个机器周期XCH A,2EH ;2字节,字节,1个机器周期个机器周期 以上两种方法均可以实现所要求的传送任务。以上两种方法均可以实现所要求的传送任务。方法一使用方法一使用14个字节的指令代码,执行时间为个字节的指令代码,执行时间为9个机个机器周期;方法二仅用了器周期;方法二仅用了
27、9个字节的代码,执行时间也个字节的代码,执行时间也减少到了减少到了5个机器周期。实际应用中应尽量采用指令个机器周期。实际应用中应尽量采用指令代码字节数少、执行时间短的高效率程序,即代码字节数少、执行时间短的高效率程序,即注意注意程序的优化程序的优化。29 例例 有一变量存放在片内有一变量存放在片内RAM的的20H单元,其取值范围为:单元,其取值范围为:00H05H。要求编制一段查表程序,根据。要求编制一段查表程序,根据变量值求其平方值,并存入片内变量值求其平方值,并存入片内RAM的的21H单元。程序如下:单元。程序如下:ORG 1000HSTART:MOV DPTR,#2000H MOV A,
28、20H MOVC A,A+DPTR MOV 21H,A SJMP$ORG 2000HTABLE:DB 00,01,04,09,16,25 END 30在程序存储器的一片存储单元中建立起该变在程序存储器的一片存储单元中建立起该变量的平方表。用数据指针量的平方表。用数据指针DPTR指向平方表的指向平方表的首址,则变量与数据指针之和的地址单元中的首址,则变量与数据指针之和的地址单元中的内容就是变量的平方值。内容就是变量的平方值。采用采用MOVC A,A+PC指令也可以实现查指令也可以实现查表功能,且不破坏表功能,且不破坏DPTR的内容,从而可以减的内容,从而可以减少保护少保护DPTR的内容所需的开销
29、。但表格只能的内容所需的开销。但表格只能存放在存放在MOVC A,A+PC指令后的指令后的256字节字节内,即表格存放的地点和空间有一定限制。内,即表格存放的地点和空间有一定限制。31 三、简单运算三、简单运算 由于由于80C51指令系统中只有单字节加法指令,因指令系统中只有单字节加法指令,因此对于多字节的相加运算必须从低位字节开始分字此对于多字节的相加运算必须从低位字节开始分字节进行。除最低字节可以使用节进行。除最低字节可以使用ADD指令外,其他字指令外,其他字节相加时要把低字节的进位考虑进去,这时就应该节相加时要把低字节的进位考虑进去,这时就应该使用使用ADDC指令。指令。例例 双字节无符
30、号数加法。双字节无符号数加法。设被加数存放在内部设被加数存放在内部RAM的的51H、50H单元,单元,加数存放在内部加数存放在内部RAM的的61H、60H单元,相加的结单元,相加的结果存放在内部果存放在内部RAM的的51H、50H单元,进位存放在单元,进位存放在位寻址区的位寻址区的00H位中。位中。32 程序段如下:程序段如下:MOV R0,50H;被加数的低字节地址;被加数的低字节地址MOV R1,60H;加数的低字节地址;加数的低字节地址MOV A,R0 ;取被加数低字节;取被加数低字节ADD A,R1 ;加上加数低字节;加上加数低字节MOV R0,A ;保存低字节相加结果;保存低字节相加
31、结果INC R0 ;指向被加数高字节;指向被加数高字节INC R1 ;指向加数高字节;指向加数高字节MOV A,R0 ;取被加数高字节;取被加数高字节ADDC A,R1 ;加上加数高字节(带进位加);加上加数高字节(带进位加)MOV R0,A ;存高字节相加结果;存高字节相加结果MOV 00H,C ;保存进位;保存进位SJMP$33 4.3.2 4.3.2 分支程序分支程序 分支结构可以分成单分支、双分支和多分支分支结构可以分成单分支、双分支和多分支几种情况几种情况:34一、单分支程序一、单分支程序例例 求双字节补码。求双字节补码。设在内部设在内部RAM的的addr1和和addr+1单元存单元
32、存有一个双字节数(高位字节存于高地址单元)有一个双字节数(高位字节存于高地址单元)。编写程序将其读出取补后再存入。编写程序将其读出取补后再存入addr2和和addr2+1单元。单元。方法:方法:首先对低字节取补,然后判其结果首先对低字节取补,然后判其结果是否为全是否为全“0”。若是,则高字节取补,否。若是,则高字节取补,否则高字节取反。则高字节取反。35START:MOV R0,#addr1 ;原码低字节地址送;原码低字节地址送R0 MOV R1,#addr2 ;补码低字节地址送;补码低字节地址送R1 MOV A,R0 ;原码低字节送;原码低字节送A CPL A ;A内容取补内容取补 INC
33、A MOV R1,A ;存补码低字节;存补码低字节 INC R0 ;调整地址,指向下一单元;调整地址,指向下一单元 INC R1 JZ ZERO ;(;(A)=0时转时转ZERO MOV A,R0 ;原码高字节送;原码高字节送A CPL A MOV R1,A ;高字节反码存入;高字节反码存入addr2+1单元单元 SJMP LOOP1 ZERO:MOV A,R0 ;高字节取补存入;高字节取补存入addr2+1单元单元 CPL A INC A MOV R1,A LOOP1:SJMP$36二、双分支程序二、双分支程序例例 设变量设变量 x 以补码的形式存放在片内以补码的形式存放在片内RAM的的30
34、H单元,变量单元,变量 y。变量为。变量为RAM的的32H单元的内容。当单元的内容。当 x 大于大于0时,时,y=x;当;当 x=0时,时,y=20H;当;当 x 小于小于0时,时,y=x+5。编制程序,根据。编制程序,根据 x 的大小求的大小求y并送并送回原单元。程序段如下:回原单元。程序段如下:START:MOV A,30H JZ NEXT ;等于零:;等于零:y=20H ANL A,#80H ;判断符号位;判断符号位 JZ LP ;大于零:;大于零:y=x MOV A,#05H ;小于零:;小于零:y=x+5 ADD A,30H MOV 32H,A SJMP LPNEXT:MOV 32H
35、,#20HLP:SJMP$37三、多分支程序三、多分支程序例例 根据根据R7的内容转向相应的处理程序。的内容转向相应的处理程序。设设R7的内容为的内容为0N,对应的处理程序的入口地址分别为,对应的处理程序的入口地址分别为PP0PPN。程序段如。程序段如下:下:START:MOV DPTR,#TAB ;置分支入口地址表首址;置分支入口地址表首址 MOV A,R7 ;分支转移序号送;分支转移序号送A ADD A,R7 ;分支转移序号乘以;分支转移序号乘以2 MOV R3,A ;暂存于;暂存于R3 MOVC A,A+DPTR ;取高位地址;取高位地址 XCH A,R3 INC A MOVC A,A+
36、DPTR ;取低位地址;取低位地址 MOV DPL,A ;处理程序入口地址低;处理程序入口地址低8位送位送DPL MOV DPH,R3 ;处理程序入口地址高;处理程序入口地址高8位送位送DPH CLR A JMP A+DPTR TAB:DW PP0 DW PP1 DW PPN 384.3.3 4.3.3 循环程序循环程序按某种控制规律重复执行的程序称为循环程序。循环程序按某种控制规律重复执行的程序称为循环程序。循环程序有有先执行后判断先执行后判断和和先判断后执行先判断后执行两种基本结构两种基本结构:39一、先执行后判断一、先执行后判断例例 50ms延时程序。延时程序。若晶振频率为若晶振频率为1
37、2MHz,则一个机器周期为,则一个机器周期为1s。执行一条。执行一条DJNZ指令需要指令需要2个机器周期,即个机器周期,即 2s。采用循环计数法实。采用循环计数法实现延时,循环次数可以通过计算获得,并选择现延时,循环次数可以通过计算获得,并选择先执行后判先执行后判断断的循环结构。程序段如下:的循环结构。程序段如下:DEL:MOV R7,#200 ;1 sDEL1:MOV R6,#123 ;1 s NOP ;1 sDEL2:DJNZ R6,DEL2 ;2s,计,计(2123)s DJNZ R7,DEL1 ;2s,RET ;2s共计共计 1+(21232 2)200+2 s,即,即50.003ms
38、40 例例 无符号数排序程序。在片内无符号数排序程序。在片内RAM中,起始地中,起始地址为址为30H的的10个单元中存放的全是个单元中存放的全是8位无符号数。试位无符号数。试对这些无符号数进行升序排序。对这些无符号数进行升序排序。数据排序数据排序常用的方法是冒泡排序法。执行时从前向常用的方法是冒泡排序法。执行时从前向后进行相邻数的比较,如数据的大小次序与要求的后进行相邻数的比较,如数据的大小次序与要求的顺序不符就将这两个数互换,否则不互换。对于升顺序不符就将这两个数互换,否则不互换。对于升序排序,通过这种相邻数的互换,使小数向前移动,序排序,通过这种相邻数的互换,使小数向前移动,大数向后移动。
39、从前向后进行一次冒泡(相邻数的大数向后移动。从前向后进行一次冒泡(相邻数的互换),就会把最大的数换到最后。再进行一次冒互换),就会把最大的数换到最后。再进行一次冒泡,就会把次大的数排在倒数第二的位置。泡,就会把次大的数排在倒数第二的位置。设设R7为比较次数计数器为比较次数计数器,初始值为,初始值为09H,位地址,位地址00H为数据互换标志位。为数据互换标志位。41START:CLR 00H ;互换标志清;互换标志清0 MOV R7,#09H ;首次冒泡比较次数;首次冒泡比较次数 MOV R0,#30H ;数据区首址;数据区首址LOOP:MOV A,R0 ;取前数;取前数 MOV 2BH,A ;
40、暂存;暂存 INC R0 MOV 2AH,R0 ;取后数;取后数 CLR C SUBB A,R0 ;前数减后数;前数减后数 JC NEXT ;前数小于后数,不互换前数小于后数,不互换 MOV R0,2BH DEC R0 MOV R0,2AH ;两数交换;两数交换 INC R0 ;准备下一次比较;准备下一次比较 SETB 00H ;置互换标志;置互换标志NEXT:DJNZ R7,LOOP ;进行下一次比较;进行下一次比较 JB 00H,START ;进行下一轮冒泡;进行下一轮冒泡 SJMP$42二、先判断后执行二、先判断后执行 例例 将内部将内部RAM中起始地址为中起始地址为data的数据串传送
41、到外部的数据串传送到外部RAM中起始中起始地址为地址为buffer的存储区域内,直到发现的存储区域内,直到发现$字符停止传送。由于循环次字符停止传送。由于循环次数事先不知道,但循环条件可以测试到。所以,采用先判断后执行的结数事先不知道,但循环条件可以测试到。所以,采用先判断后执行的结构比较适宜。程序段如下构比较适宜。程序段如下:MOV R0,#data MOV DPTR,#bufferLOOP0:MOV A,R0 CJNE A,#24H,LOOP1;判断是否为;判断是否为$字符字符 SJMP DONE;是;是$字符,转结束字符,转结束LOOP1:MOVX DPTR,A ;不是;不是$字符,执行
42、传送字符,执行传送 INC R0 INC DPTR SJMP LOOP0 ;传送下一数据;传送下一数据DONE:SJMP$434.3.4 4.3.4 子程序及其调用子程序及其调用一、子程序的调用一、子程序的调用 在实际应用中,经常会遇到一些带有在实际应用中,经常会遇到一些带有通用性的问通用性的问题题,例如:数值转换、数值计算等,在一个程序中,例如:数值转换、数值计算等,在一个程序中可能要使用多次。这时可以将其可能要使用多次。这时可以将其设计成通用的子程设计成通用的子程序供随时调用序供随时调用。子程序主要特点子程序主要特点是,在执行过程中需要由其它程是,在执行过程中需要由其它程序来调用,执行完后
43、又需要把执行流程返回到调用序来调用,执行完后又需要把执行流程返回到调用该子程序的主程序。该子程序的主程序。子程序调用时要注意两点:一是现场的保护和恢子程序调用时要注意两点:一是现场的保护和恢复;二是主程序与子程序的参数传递。复;二是主程序与子程序的参数传递。44二、现场保护与恢复二、现场保护与恢复 在子程序执行过程中常常要用到单片机的一些通在子程序执行过程中常常要用到单片机的一些通用单元,如工作寄存器用单元,如工作寄存器R0R7、累加器、累加器A、数据指、数据指针针DPTR,以及有关标志和状态等。而这些单元中,以及有关标志和状态等。而这些单元中的内容在调用结束后的主程序中仍有用,所以需要的内容
44、在调用结束后的主程序中仍有用,所以需要进行保护,称为进行保护,称为现场保护现场保护。在执行完子程序,返回继续执行主程序前恢复其在执行完子程序,返回继续执行主程序前恢复其原内容,称为原内容,称为现场恢复现场恢复。保护与恢复的方法有以下。保护与恢复的方法有以下两种:两种:在主程序中实现;在主程序中实现;在子程序中实现。在子程序中实现。45 1、在主程序中实现、在主程序中实现 示例如下:示例如下:PUSH PSW ;保护现场;保护现场 PUSH ACC PUSH B MOV PSW,#10H;换当前工作寄存器组;换当前工作寄存器组 LCALL addr16 ;子程序调用;子程序调用 POP B ;恢
45、复现场;恢复现场 POP ACC POP PSW 其特点是结构灵活。其特点是结构灵活。46 2、在子程序中实现、在子程序中实现示例如下:示例如下:SUB1:PUSH PSW ;保护现场;保护现场 PUSH ACC PUSH B MOV PSW,#10H;换当前工作寄存器组;换当前工作寄存器组 POP B ;恢复现场;恢复现场 POP ACC POP PSW RET其特点是程序规范、清晰。其特点是程序规范、清晰。注意,无论哪种方法保护与恢复的注意,无论哪种方法保护与恢复的顺序要对应。顺序要对应。47三、参数传递三、参数传递 由于子程序是主程序的一部分,所以,在程序的执行时必由于子程序是主程序的一
46、部分,所以,在程序的执行时必然要发生然要发生数据上的联系数据上的联系。在调用子程序时,主程序应通过某。在调用子程序时,主程序应通过某种方式把有关参数(即子程序的入口参数)传给子程序,当种方式把有关参数(即子程序的入口参数)传给子程序,当子程序执行完毕后,又需要通过某种方式把有关参数(即子子程序执行完毕后,又需要通过某种方式把有关参数(即子程序的出口参数)传给主程序。在程序的出口参数)传给主程序。在80C51单片机中,传递参单片机中,传递参数的方法有三种:数的方法有三种:1、利用累加器或寄存器、利用累加器或寄存器 在这种方式中,要把在这种方式中,要把预传递的参数存放在累加器预传递的参数存放在累加
47、器A或工作或工作寄存器寄存器R0R7中中。即在主程序调用子程序时,应事先把子程。即在主程序调用子程序时,应事先把子程序需要的数据送入累加器序需要的数据送入累加器A或指定的工作寄存器中,当子程序或指定的工作寄存器中,当子程序执行时,可以从指定的单元中取得数据,执行运算。反之,执行时,可以从指定的单元中取得数据,执行运算。反之,子程序也可以用同样的方法把结果传送给主程序。子程序也可以用同样的方法把结果传送给主程序。48 例例 编写程序,实现编写程序,实现c=a2+b2。设。设a,b,c分别存于内部分别存于内部RAM的的30H,31H,32H三个单元中。程序段如下:三个单元中。程序段如下:START
48、:MOV A,30H ;取;取a ACALL SQR ;调用查平方表;调用查平方表 MOV R1,A ;a2 暂存于暂存于R1中中 MOV A,31H ;取;取b ACALL SQR ;调用查平方表;调用查平方表 ADD A,R1 ;a2+b2 存于存于A中中 MOV 32H,A ;存结果;存结果 SJMP$SQR:MOV DPTR,#TAB ;子程序;子程序 MOVC A,A+DPTR RET TAB:DB 0,1,4,9,16,25,36,49,64,81 49 2、利用存储器、利用存储器 当传送的当传送的数据量比较大数据量比较大时,可以利用存储器实现参时,可以利用存储器实现参数的传递。在
49、这种方式中,事先要建立一个参数表,数的传递。在这种方式中,事先要建立一个参数表,用指针指示参数表所在的位置。当参数表建立在内部用指针指示参数表所在的位置。当参数表建立在内部RAM时,用时,用R0或或R1作参数表的指针。当参数表建立作参数表的指针。当参数表建立在外部在外部RAM时,用时,用DPTR作参数表的指针。作参数表的指针。例例 将将R0和和R1指向的内部指向的内部RAM 中两个中两个3字节无字节无符号整数相加,结果送到由符号整数相加,结果送到由R0指向的内部指向的内部RAM中。中。低字节在高地址低字节在高地址,高字节在低地址高字节在低地址。(入口时,入口时,R0和和R1分别指向加数和被加数
50、的低位字节;出口时,分别指向加数和被加数的低位字节;出口时,R0指向结果的高位字节。指向结果的高位字节。)50 实现程序:实现程序:NADD:MOV R7,#3 ;三字节加法;三字节加法 CLR C NADD1:MOV A,R0 ;取加数低字节;取加数低字节 ADDC A,R1 ;被加数低字节加;被加数低字节加A MOV R0,A ;存结果;存结果 DEC R0 ;指向高字节;指向高字节 DEC R1 DJNZ R7,NADD1 INC R0 RET 51 3、利用堆栈、利用堆栈 利用堆栈传递参数是在利用堆栈传递参数是在子程序嵌套中子程序嵌套中常采常采用的一种方法。在调用子程序前,用用的一种方