收藏 分销(赏)

51汇编语言程序设计.ppt

上传人:w****g 文档编号:2309921 上传时间:2024-05-27 格式:PPT 页数:86 大小:264KB
下载 相关 举报
51汇编语言程序设计.ppt_第1页
第1页 / 共86页
51汇编语言程序设计.ppt_第2页
第2页 / 共86页
51汇编语言程序设计.ppt_第3页
第3页 / 共86页
51汇编语言程序设计.ppt_第4页
第4页 / 共86页
51汇编语言程序设计.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、第第4 4章章 89C51 89C51汇编语言程序的设计与调试汇编语言程序的设计与调试 本章主要介绍本章主要介绍程序设计的基本知识程序设计的基本知识及如何及如何使用使用汇编语言来进行基本的程序设计。汇编语言来进行基本的程序设计。4.1 4.1 汇编语言程序设计概述汇编语言程序设计概述 程序是若干指令的有序集合,单片机的运行就程序是若干指令的有序集合,单片机的运行就是执行这一指令序列的过程,编写这一指令序列是执行这一指令序列的过程,编写这一指令序列的过程称为的过程称为程序设计程序设计。4.1.1 4.1.1 机器语言、汇编语言和高级语言机器语言、汇编语言和高级语言 用于程序设计的用于程序设计的语

2、言基本上分为语言基本上分为3 3种:机器语种:机器语言、汇编语言和高级语言言、汇编语言和高级语言。1.1.机器语言机器语言 二进制代码表示的指令、数字和符号简称为机器语言二进制代码表示的指令、数字和符号简称为机器语言不易懂,难记忆,易出错。不易懂,难记忆,易出错。2 2汇编语言汇编语言 n英文助记符表示的指令称为英文助记符表示的指令称为符号语言符号语言或或汇编语言。汇编语言。n将汇编语言程序转换成为二进制代码表示的机器语言程序将汇编语言程序转换成为二进制代码表示的机器语言程序称为称为汇编程序。汇编程序。n经汇编程序经汇编程序“汇编(翻译)汇编(翻译)”得到的机器语言程序称为得到的机器语言程序称

3、为目目标程序标程序,原来的汇编语言程序称为,原来的汇编语言程序称为源程序源程序。汇编语言特点汇编语言特点:(1)(1)面向机器的语言,程序设计员须对面向机器的语言,程序设计员须对89C5189C51的硬件有相当深的硬件有相当深入的了解。入的了解。(2)(2)助记符指令和机器指令一一对应,用汇编语言编写的助记符指令和机器指令一一对应,用汇编语言编写的程序程序效率高效率高,占用,占用存储空间小存储空间小,运行,运行速度快速度快,用汇编语言能编,用汇编语言能编写出最优化的程序。写出最优化的程序。(3)(3)能能直接管理和控制硬件设备直接管理和控制硬件设备(功能部件),它能处理中断,(功能部件),它能

4、处理中断,也能直接访问存储器及也能直接访问存储器及I/OI/O接口电路。接口电路。(4)(4)汇编语言和机器语言汇编语言和机器语言都脱离不开具体机器的硬件,均是面都脱离不开具体机器的硬件,均是面向向“机器机器”的语言,缺乏通用性。的语言,缺乏通用性。3 3高级语言高级语言n不受具体机器的限制不受具体机器的限制,使用了许多数学公式和数学计算上的习使用了许多数学公式和数学计算上的习惯用语,惯用语,非常擅长于科学计算。非常擅长于科学计算。常用的如常用的如BASICBASIC、FORTRANFORTRAN以以及及C C语言等。语言等。n高级语言高级语言优点优点:通用性强,直观、易懂、易学,可读性好。:

5、通用性强,直观、易懂、易学,可读性好。n计算机不能直接识别和执行高级语言,需将其计算机不能直接识别和执行高级语言,需将其“翻译翻译”成机成机器语言才能识别和执行,进行器语言才能识别和执行,进行“翻译翻译”的专用程序称为的专用程序称为编译编译程序程序。n使用使用C C语言(语言(C51C51)、)、PL/MPL/M语言来进行语言来进行MCS-51MCS-51的应用程序设计。的应用程序设计。n对于程序的空间和时间要求很高的场合,汇编语言仍是必对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。不可缺的。nC C语言和汇编语言混合编程。语言和汇编语言混合编程。n在很多需要直接控制硬件的应用场

6、合,则更是非用汇编语在很多需要直接控制硬件的应用场合,则更是非用汇编语言不可。言不可。n使用汇编语言编程,是单片机程序设计的基本功之一使用汇编语言编程,是单片机程序设计的基本功之一4.1.2 4.1.2 汇编语言语句的种类和格式汇编语言语句的种类和格式两种基本类型:两种基本类型:指令语句指令语句和和伪指令语句伪指令语句(1 1)指令语句)指令语句已在第已在第3 3章介绍章介绍每一条指令语句在汇编时都产生一个指令代码每一条指令语句在汇编时都产生一个指令代码机器代码机器代码(2 2)伪指令语句)伪指令语句 是为汇编服务的,在汇编时是为汇编服务的,在汇编时没有机器代码与之对应。没有机器代码与之对应。

7、MCS-51MCS-51的汇编语言的的汇编语言的四分段格式四分段格式如下:如下:标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段规则:规则:(1 1)标号字段和操作字码段之间要有冒号)标号字段和操作字码段之间要有冒号“:”相隔;相隔;(2 2)操作码字段和操作数字段间的分界符是空格;)操作码字段和操作数字段间的分界符是空格;(3 3)双操作数之间用逗号相隔;)双操作数之间用逗号相隔;(4 4)操作数字段和注释字段之间的分界符用分号)操作数字段和注释字段之间的分界符用分号“;”相隔,相隔,操作码字段为必选项,其余各段为任选项。操作码字段为必选项,其余各段为任选项。例

8、例4-14-1 下面是一段汇编语言程序的四分段书写格式下面是一段汇编语言程序的四分段书写格式标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段 STARTSTART:MOV AMOV A,#00H#00H ;0A0A MOV R1 MOV R1,#10#10 ;10R110R1 MOV R2MOV R2,#00000011B#00000011B;3R23R2LOOPLOOP:ADD AADD A,R2 R2 ;(;(A A)+(R2R2)AADJNZ R1DJNZ R1,LOOPLOOP;R1R1内容减内容减1 1不为零,则循环不为零,则循环 NOP NOP HER

9、E HERE:SJMP HERESJMP HERE基本语法规则:基本语法规则:1 1标号字段:标号字段:是语句所在地址的标志符号。是语句所在地址的标志符号。(1 1)标号后边必须跟以冒号)标号后边必须跟以冒号“:”(2 2)由)由1-81-8个个ASCIIASCII字符组成字符组成(3 3)同一标号在一个程序中只能定义一次)同一标号在一个程序中只能定义一次 (4 4)不能使用汇编语言已经定义的符号作为标号)不能使用汇编语言已经定义的符号作为标号 2 2操作码字段:操作码字段:是汇编语言指令中是汇编语言指令中唯一不能空缺唯一不能空缺的部分。的部分。汇编程序就是汇编程序就是根据这一字段来生成机器代

10、码根据这一字段来生成机器代码的。的。3 3操作数字段操作数字段 通常有单操作数、双操作数和无操作数三种情况。如果通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。是双操作数,则操作数之间,要以逗号隔开。(1 1)十六进制、二进制和十进制形式的操作数表示)十六进制、二进制和十进制形式的操作数表示采用十六采用十六进制形式来表示进制形式来表示 ,某些特殊场合才采用二进制或十进制的,某些特殊场合才采用二进制或十进制的表示形式表示形式 。十六进制,后缀十六进制,后缀“H”“H”。二进制,后缀二进制,后缀“B”“B”。十进制,后缀十进制,后缀“D”“D”,也可省略也可

11、省略。若十六进制的若十六进制的操作数以字符操作数以字符A A-F F中的某个开头时,则需在它中的某个开头时,则需在它前面加一个前面加一个“0”“0”,以便在汇编时把它和字符,以便在汇编时把它和字符A AF F区别开来。区别开来。(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示n采用工作寄存器和特殊功能寄存器的代号来表示,也可用其采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来表示。地址来表示。n例如,例如,累加器可用累加器可用A A(或(或AccAcc)表示,也可用表示,也可用0E0H0E0H来表示,来表示,0E0H0E0H为累加器为累加器A A的地址。的

12、地址。(3 3)美元符号)美元符号$的使用的使用n用于表示该转移指令操作码所在的地址。用于表示该转移指令操作码所在的地址。n例如,例如,JNB F0 JNB F0,$等价于等价于 HERE HERE:JNB F0JNB F0,HEREHERE n再如:再如:HEREHERE:SJMP HERESJMP HERE 可写为:可写为:SJMP$SJMP$4 4注释字段注释字段 n必须以分号必须以分号“;”开头,换行书写,但必须注意也要以分开头,换行书写,但必须注意也要以分号号“;”开头。开头。n汇编时,注释字段不会产生机器代码。汇编时,注释字段不会产生机器代码。4.1.3 4.1.3 伪指令伪指令n

13、在在MCS-51 MCS-51 汇编语言源程序中应有向汇编程序发出的指示汇编语言源程序中应有向汇编程序发出的指示信息,告诉它信息,告诉它如何完成汇编工作如何完成汇编工作,这是通过使用伪指令,这是通过使用伪指令来实现的。来实现的。n也称为汇编程序控制命令。只有在汇编前的源程序中才有也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。经过汇编得到目标程序(机器代码)后,伪指伪指令。经过汇编得到目标程序(机器代码)后,伪指令已无存在的必要,所以令已无存在的必要,所以“伪伪”体现在汇编时,体现在汇编时,伪指令伪指令没有相应的机器代码产生没有相应的机器代码产生。常用的伪指令常用的伪指令:1.ORG

14、1.ORG(ORiGinORiGin)汇编起始地址命令)汇编起始地址命令n在汇编语言源程序的开始,通常都用一条在汇编语言源程序的开始,通常都用一条ORGORG伪指令来实现规伪指令来实现规定程序的起始地址。如不用定程序的起始地址。如不用ORGORG规定,则汇编得到的目标程序规定,则汇编得到的目标程序将从将从0000H0000H开始。开始。n例如:例如:ORG 2000H ORG 2000HSTARTSTART:MOV A,#00HMOV A,#00H规定标号规定标号STARTSTART代表地址为代表地址为2000H2000H开始。开始。n在在一一个个源源程程序序中中,可可多多次次使使用用ORGO

15、RG指指令令,来来规规定定不不同同的的程程序序段段的的起起始始地地址址。但但是是,地地址址必必须须由由小小到到大大排排列列,地地址址不不能交叉、重叠能交叉、重叠。例如:。例如:ORG 2000HORG 2000H ORG 2500H ORG 2500H ORG 3000HORG 3000H 2.END(END of assembly)2.END(END of assembly)汇编终止命令汇编终止命令 汇编语言源程序的结束标志,用于终止汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有源程序的汇编工作。在整个源程序中只能有一条一条ENDEND命令,且位于程序的最后。命令,

16、且位于程序的最后。3 3DBDB(Define ByteDefine Byte)定义字节命令)定义字节命令 在程序存储器的连续单元中定义字节数据。在程序存储器的连续单元中定义字节数据。ORG 2000HORG 2000HDB 30HDB 30H,40H40H,2424,“C”“C”,“B”“B”n汇编后:汇编后:(2000H2000H)=30H=30H(2001H2001H)=40H=40H(2002H2002H)=18H=18H(1010进制数进制数2424)(2003H2003H)=43H=43H(字符(字符“C”“C”的的ASCIIASCII码)码)(2004H2004H)=42H=42

17、H(字符(字符“B”“B”的的ASCIIASCII码)码)nDBDB功能是功能是从指定单元开始定义(存储)若干个字节,从指定单元开始定义(存储)若干个字节,10 10进制数自然转换成进制数自然转换成1616进制数,字母按进制数,字母按ASCIIASCII码存储。码存储。4 4DWDW(Define WordDefine Word)定义数据字命令)定义数据字命令n从从指指定定的的地地址址开开始始,在在程程序序存存储储器器的的连连续续单单元元中中定定义义1616位位的数据字。的数据字。n例如:例如:ORG 2000HORG 2000H DW 1246H DW 1246H,7BH7BH,1010n汇

18、编后:汇编后:(2000H2000H)=12H12H;第;第1 1个字个字(2001H2001H)=46H46H (2002H2002H)=00H=00H;第;第2 2个字个字(2003H2003H)=7BH=7BH(2004H2004H)=00H=00H;第;第3 3个字(个字(2005H2005H)=0AH=0AH(2005H2005H)=0AH=0AH 5 5EQUEQU(EQUateEQUate)赋值命令)赋值命令n用于用于给标号赋值给标号赋值。赋值以后,其标号值在整。赋值以后,其标号值在整个程序有效。个程序有效。n例如例如:TEST EQU 2000H TEST EQU 2000H

19、表示标号表示标号TEST=2000HTEST=2000H,在汇编时,凡是遇到,在汇编时,凡是遇到标号标号TESTTEST时,均以时,均以2000H2000H来代替。来代替。4.1.4 4.1.4 汇编语言程序设计步骤汇编语言程序设计步骤(1 1)分析问题,确定算法)分析问题,确定算法(2 2)根据算法,画出程序框图)根据算法,画出程序框图(3 3)分配内存工作区及有关端口地址)分配内存工作区及有关端口地址(4 4)编写程序)编写程序,养成在程序的养成在程序的适当位置上加上注释适当位置上加上注释的的 好习惯。好习惯。(5 5)上机调试)上机调试n编写完毕的程序,必须编写完毕的程序,必须“汇编汇编

20、”成机器代码,才能调试和运成机器代码,才能调试和运行,调试与硬件有关程序还要借助于仿真开发工具并与硬件行,调试与硬件有关程序还要借助于仿真开发工具并与硬件连接。连接。4.2 4.2 汇编语言源程序的汇编汇编语言源程序的汇编n汇编语言源程序汇编语言源程序“翻译翻译”成机器代码(指令代码)成机器代码(指令代码)的过程称为的过程称为“汇编汇编”。n汇编可分为汇编可分为手工汇编手工汇编和和机器汇编机器汇编两类。两类。4.2.1 4.2.1 手工汇编手工汇编 人工查表翻译指令人工查表翻译指令。但遇到的相对转移指令的偏移。但遇到的相对转移指令的偏移量的计算,要根据转移的目标地址计算偏移量,不量的计算,要根

21、据转移的目标地址计算偏移量,不但麻烦,且容易出错。但麻烦,且容易出错。4.2.2 4.2.2 机器汇编机器汇编n用编辑软件进行源程序的用编辑软件进行源程序的编辑编辑。编辑完成后,生成一个。编辑完成后,生成一个ASCIIASCII码文件,码文件,扩展名为扩展名为“.ASM”“.ASM”。然后在微计算机上运行。然后在微计算机上运行汇编程序,把汇编语言源程序翻译成机器代码。汇编程序,把汇编语言源程序翻译成机器代码。n交叉汇编交叉汇编汇编后的机器代码是在另一台计算机(这里是汇编后的机器代码是在另一台计算机(这里是单片机)上运行。单片机)上运行。MCS-51MCS-51单片机的应用程序的完成,应经过三个

22、步骤:单片机的应用程序的完成,应经过三个步骤:(1 1)在微计算机上,运行编辑程序进行源程序的)在微计算机上,运行编辑程序进行源程序的输入和编辑输入和编辑;(2 2)对源程序进行)对源程序进行交叉汇编交叉汇编得到机器代码;得到机器代码;(3 3)通通过过微微计计算算机机的的串串行行口口(或或并并行行口口)把把机机器器代代码码传传送送到到用用户样机(或在线仿真器户样机(或在线仿真器)上进行程序的调试和运行。)上进行程序的调试和运行。第一步,第一步,只需在微计算机上使用通用的编辑软件即可完成。只需在微计算机上使用通用的编辑软件即可完成。第二步第二步,交叉汇编所用的汇编程序可在购买单片机的仿真开,交

23、叉汇编所用的汇编程序可在购买单片机的仿真开 发工具时,由厂商提供。发工具时,由厂商提供。第三步第三步,要借助于单片机仿真开发工具进行。,要借助于单片机仿真开发工具进行。n有时,在分析某些产品的程序的机器代码时,有时,在分析某些产品的程序的机器代码时,需将需将机器代码机器代码翻译成翻译成汇编语言源程序汇编语言源程序,称为,称为“反汇编反汇编”。例例4-24-2 下下面面是是一一段段源源程程序序的的汇汇编编结结果果,读读者者可可通通过过查查第第3 3章章的的指指令令表表,进进行行手手工工汇汇编编,来来验验证证下下面面的的汇汇编编结结果果是是否否正正确确。机器码从机器码从1000H单元开始存放。单元

24、开始存放。见表见表4-14-1:4.3 4.3 汇编语言实用程序设计汇编语言实用程序设计 4.3.1 4.3.1 汇编语言程序的基本结构汇编语言程序的基本结构 顺序结构顺序结构、分支结构分支结构和和循环结构循环结构,子程序子程序和和中断服务子程序中断服务子程序。1 1顺序结构顺序结构 2 2分支结构分支结构 程序中含有转移指令,程序中含有转移指令,无条件分支,有条件分支无条件分支,有条件分支。有条件分支又分为:有条件分支又分为:单分支单分支结构和结构和多分支多分支结构。结构。3 3循环结构循环结构 4 4子程序子程序 5 5中断服务子程序中断服务子程序4.3.2 4.3.2 子程序的设计子程序

25、的设计1.1.子程序设计原则和应注意的问题子程序设计原则和应注意的问题n一种能完成某一特定任务的程序段一种能完成某一特定任务的程序段。其资源要为所有调用程。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性。序共享。因此,子程序在结构上应具有独立性和通用性。n编写子程序时应注意以下问题:编写子程序时应注意以下问题:1 1子程序的第一条指令的地址称为子程序的入口地址。该指子程序的第一条指令的地址称为子程序的入口地址。该指令前令前必须有标号必须有标号。2 2主程序调用子程序主程序调用子程序 两条子程序调用指令:两条子程序调用指令:(1 1)绝对调用指令:)绝对调用指令:ACALL

26、 addr11ACALL addr11 (2 2)长调用指令:)长调用指令:LCALL addr16LCALL addr163 3注意设置堆栈指针和现场保护注意设置堆栈指针和现场保护4 4最后一条指令必须是最后一条指令必须是RETRET指令指令5 5子程序可以嵌套,即子程序可以嵌套,即子程序可以调用子程序子程序可以调用子程序6 6在子程序调用时,还要注意参数传递的问题在子程序调用时,还要注意参数传递的问题 2.2.子程序的基本结构子程序的基本结构 MAINMAIN:;MAINMAIN为主程序或调用程序标号为主程序或调用程序标号 LCALL SUB LCALL SUB;调用子程序;调用子程序SU

27、BSUB SUBSUB:PUSH PSWPUSH PSW;现场保护;现场保护 PUSH ACCPUSH ACC;子程序处理程序段子程序处理程序段POP ACCPOP ACC;现场恢复;现场恢复POP PSWPOP PSW;RETRET;最后一条指令必须为;最后一条指令必须为RETRET例例4-34-3 单字节有符号数的加减法子程序(自己阅读)单字节有符号数的加减法子程序(自己阅读)本例中参数传递是通过累加器本例中参数传递是通过累加器A A完成的,主程序将被完成的,主程序将被转换的数送到转换的数送到A A中,子程序将中,子程序将A A中的有符号数求补后中的有符号数求补后存于存于A A中,主程序再

28、将结果放回原来的单元。中,主程序再将结果放回原来的单元。例例4-44-4 4 4位位BCDBCD码的减法程序(自己阅读)码的减法程序(自己阅读)主程序通过地址寄存器主程序通过地址寄存器R0R0和和R1R1将参加运算的将参加运算的BCDBCD码的码的地址传递给子程序,子程序则通过累加器将差传递地址传递给子程序,子程序则通过累加器将差传递给主程序。给主程序。4.3.3 4.3.3 查表程序设计查表程序设计 n数据补偿、修正、计算、转换等各种功能,具有程数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。序简单、执行速度快等优点。n查表就是根据自变量查表就是根据自变量x x,在表格

29、中寻找在表格中寻找y y,使使y=f(x)y=f(x)。n执行查表指令时,发出执行查表指令时,发出读程序存储器选通脉冲读程序存储器选通脉冲PSENPSEN*。n指令系统,给用户提供了指令系统,给用户提供了两条极为有用的查表指令:两条极为有用的查表指令:MOVC MOVCA A,A+DPTRA+DPTR MOVC MOVCA A,A+PCA+PCMOVC AMOVC A,A+DPTRA+DPTR 完成把完成把A A中的内容作为一个无符号数与中的内容作为一个无符号数与DPTRDPTR中的内容相加,所中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的得结果为某一程序存储单元的地址,

30、然后把该地址单元中的内容送到累加器内容送到累加器A A中。中。MOVCMOVCA A,A+PCA+PC 以以PCPC作为基址寄存器,作为基址寄存器,PCPC的内容和的内容和A A的内容作为无符号数,相的内容作为无符号数,相加后所得的数作为某一程序存储器单元的地址,根据地址取加后所得的数作为某一程序存储器单元的地址,根据地址取出程序存储器相应单元中的内容送到累加器出程序存储器相应单元中的内容送到累加器A A中。中。指令执行完,指令执行完,PCPC的内容不发生变化,仍指向查表指令的下一的内容不发生变化,仍指向查表指令的下一条指令。条指令。优点优点:预处理较少且不影响其它特殊功能寄存器的值,所以不预

31、处理较少且不影响其它特殊功能寄存器的值,所以不必保护其它特殊功能寄存器的原先值必保护其它特殊功能寄存器的原先值缺点缺点:在于该表格在于该表格只能存放在只能存放在这条指令的地址这条指令的地址X3X2X1X0X3X2X1X0以下的以下的0000FFHFFH之中。表格之中。表格所在的程序空间受到了限制。所在的程序空间受到了限制。例例4-44-4 子程序的功能为:根据累加器子程序的功能为:根据累加器A A中的数中的数x x(0 09 9之间)之间)查查x x的平方表的平方表y y,根据,根据x x的值查出相应的平方的值查出相应的平方y y。x x和和y y均为单均为单字节数。字节数。地地 址址 子程序

32、子程序Y3Y2Y1Y0 ADD AY3Y2Y1Y0 ADD A,#01H,#01H Y3Y2Y1Y0+2 Y3Y2Y1Y0+2 MOVC A,A+PCMOVC A,A+PCY3Y2Y1Y0+3 RETY3Y2Y1Y0+3 RET Y3Y2Y1Y0+4 Y3Y2Y1Y0+4 DB DB 00H,01H,04H,09H,10H 00H,01H,04H,09H,10H DB DB 19H,24H,31H,40H,51H 19H,24H,31H,40H,51H 第第1 1条条指指令令 ADD ADD A A,#01H#01H 的的作作用用是是加加上上偏偏移移量量,可可以以根根据据A A的内容查出的内容

33、查出X X对应的平方。对应的平方。MOVC MOVCA A,A+DPTRA+DPTR 这这条条指指令令的的应应用用范范围围较较为为广广泛泛,一一般般情情况况下下,大大多多使使用用该该指指令令,使使用用该该指指令令时时不不必必计计算算偏偏移移量量,使使用用该该指指令令的的优优点点是是表表格格可可以以设设在在64K64K程程序序存存储储器器空空间间内内的的任任何何地地方方,而而不不像像 MOVC MOVC A A,A+PCA+PC那那样样只只设设在在PCPC下下面面的的256256个个单单元中,使用较方便。元中,使用较方便。上面的程序可改成如下形式:上面的程序可改成如下形式:PUSH DPH PU

34、SH DPH ;保存;保存DPHDPHPUSH DPL PUSH DPL ;保存;保存DPLDPLMOV DPTRMOV DPTR,#TAB1#TAB1 MOVC AMOVC A,A+DPTRA+DPTR POP DPL POP DPL ;恢复;恢复DPLDPL POP DPH POP DPH ;恢复;恢复DPHDPH RET RETTAB1:TAB1:DBDB 00H 00H,01H01H,04H04H,09H09H,10H 10H DBDB 19H 19H,24H24H,31H31H,40H40H,51H51H 例例4-54-5 在一个以在一个以89C5189C51为核心的为核心的温度控制

35、器温度控制器中,温度传感器输出的电压与温度为非线性中,温度传感器输出的电压与温度为非线性关系,传感器输出的关系,传感器输出的电压已由电压已由A/DA/D转换为转换为1010位位二进制数二进制数。根据测得的不同温度下的电压值。根据测得的不同温度下的电压值数据构成一个表,表中放温度值数据构成一个表,表中放温度值y y,x x为电压为电压值数据。值数据。设设测测得得的的电电压压值值x x放放入入R2R3R2R3中中,根根据据电电压压值值x x,查查找找对对应应的的温温度度值值y y,仍仍放放入入R2R3R2R3中中。本例的。本例的x x和和y y均为均为双字节无符号数双字节无符号数。程序如下:。程序

36、如下:LTB2LTB2:MOV DPTR,#TAB2MOV DPTR,#TAB2 MOV A,R3 MOV A,R3 CLR C CLR C RLC A RLC A MOV R3,A MOV R3,A XCH A,R2 XCH A,R2 RLC A RLC A XCH R2,A XCH R2,A ADD A,DPL ADD A,DPL;(;(R2R3R2R3)+(DPTRDPTR)(DPTRDPTR)MOV DPL,A MOV DPL,A MOV A,DPHMOV A,DPH ADDC A,R2 ADDC A,R2 MOV DPH,A MOV DPH,A CLR A CLR A MOVC A,

37、A+DPTRMOVC A,A+DPTR ;查第一字节;查第一字节 MOV R2,A MOV R2,A ;第一字节存入;第一字节存入R2R2中中 CLR A CLR A INC DPTR INC DPTR MOVC A,A+DPTRMOVC A,A+DPTR ;查第二字节;查第二字节 MOV R3,A MOV R3,A ;第二字节存入;第二字节存入R3R3中中 RET RET TAB2:DW TAB2:DW ;温度值表;温度值表 例例4-64-6 设设有有一一个个巡巡回回检检测测报报警警装装置置,需需对对1616路路输输入入进进行行检检测测,每每路路有有一一最最大大允允许许值值,为为双双字字节节

38、数数。运运行行时时,需需根根据据测测量量的的路路数数,找找出出每每路路的的最最大大允允许许值值。看看输输入入值值是是否否大大于于最最大大允许值,如大于就报警。根据上述要求,编一个查表程序。允许值,如大于就报警。根据上述要求,编一个查表程序。取取路路数数为为x(0 x15),yx(0 x15),y为为最最大大允允许许值值,放放在在表表格格中中。设设进进入入查查表表程程序序前前,路路数数x x已已放放于于R2R2中中,查查表表后后最最大大值值y y放放于于R3R3、R4R4中中。本例中的本例中的x x为为单字节数单字节数,y y为为双字节数双字节数。查表程序如下:。查表程序如下:TB3:TB3:M

39、OV A,R2MOV A,R2 ADD A,R2 ADD A,R2 ;(R2)*2(A)(R2)*2(A)MOV R3,A MOV R3,A ;保存指针;保存指针 ADD A,#6 ADD A,#6 ;加偏移量;加偏移量MOVC A,A+PCMOVC A,A+PC ;查第一字节;查第一字节XCH A,R3XCH A,R3 ADD A,#3ADD A,#3 MOVC A,A+PCMOVC A,A+PC ;查第二字节;查第二字节 MOV R4,AMOV R4,ARETRET TAB3:TAB3:DWDW 1520 1520,37213721,4264542645,7580 7580;最大值表;最大

40、值表 DWDW 3483 3483,3265732657,883883,99439943 DW DW 10000 10000,4051140511,67586758,89318931 DWDW 4468 4468,58715871,1328413284,2780827808 表格长度不能超过表格长度不能超过256256个字节,且表格只能存放于个字节,且表格只能存放于MOVC A,A+PCMOVC A,A+PC指令以下指令以下的的256256个单元中。个单元中。4.3.4 4.3.4 关键字查找程序设计关键字查找程序设计 顺序检索和对分检索顺序检索和对分检索1.1.顺序检索顺序检索 从第从第1

41、1项开始逐项顺序查找,判断所取数据是项开始逐项顺序查找,判断所取数据是否与关键字相等。否与关键字相等。例例4-74-7 从从5050个字节的无序表中查找一个关键字个字节的无序表中查找一个关键字XXHXXH。ORG 1000HORG 1000HMOV 30HMOV 30H,#XXXXH H;关键字;关键字XXHXXH送送30H30H单元单元MOV R1MOV R1,#50#50 ;查找次数送;查找次数送R1R1MOV AMOV A,#14#14 ;修正值送;修正值送A AMOV DPTRMOV DPTR,#TAB4#TAB4 ;表首地址送;表首地址送DPTRDPTRLOOPLOOP:PUSH A

42、CCPUSH ACCMOVC AMOVC A,A+PC A+PC;查表结果送;查表结果送A ACJNE ACJNE A,40H40H,LOOP1LOOP1;(40H40H)不等于关键字则)不等于关键字则;转;转LOOP1LOOP1MOV R2MOV R2,DPHDPH;已查到关键字,把该字已查到关键字,把该字 ;的地址送;的地址送R2R2,R3R3MOV R3MOV R3,DPL DPL ;DONEDONE:RETRETLOOP1LOOP1:POP POP ACCACC;修正值弹出;修正值弹出 INC AINC A;A+1AA+1A INC DPTRINC DPTR ;修改数据指针;修改数据指

43、针DPTRDPTR DJNZ R1DJNZ R1,LOOP LOOP;R10R10,未查完,继续查找,未查完,继续查找MOV MOV R2R2,#00H#00H;R1=0R1=0,清,清“0”R2“0”R2 和和R3R3 MOV MOV R3R3,#00H#00H;表中;表中5050个数已查完个数已查完 AJMPAJMPDONEDONE;从子程序返回;从子程序返回TAB4TAB4:DBDB ,;5050个无序数据表个无序数据表 2.2.对分检索对分检索前提:前提:检索的检索的数据表已经排好序数据表已经排好序,如何进行数据的排序,将在,如何进行数据的排序,将在 本节稍后介绍。本节稍后介绍。方法:

44、方法:取数据取数据表中间位置表中间位置的数与关键字进行比较,的数与关键字进行比较,如相等如相等,则,则查找到;查找到;如果所取的数如果所取的数大于大于关键字关键字,则下次对分检索的范围,则下次对分检索的范围是从数据区起点到本次取数。是从数据区起点到本次取数。如果取数小于关键字如果取数小于关键字,则下次,则下次对分检索的范围是从本次取数数据区起点到数据区终点。依对分检索的范围是从本次取数数据区起点到数据区终点。依此类推,逐渐缩小检索范围,减少次数,大大此类推,逐渐缩小检索范围,减少次数,大大提高查找速度提高查找速度。4.3.5 4.3.5 数据极值查找程序设计数据极值查找程序设计n在指定的数据区

45、中在指定的数据区中找出最大值(或最小值)。找出最大值(或最小值)。n进行数值大小的比较,从这批数据中找出最大值(或最小值)进行数值大小的比较,从这批数据中找出最大值(或最小值)并存于某一单元中。并存于某一单元中。n例例4-84-8 片内片内RAMRAM中存放一批数据,查找出最大值并存放于首中存放一批数据,查找出最大值并存放于首地址中。设地址中。设R0R0中存首地址,中存首地址,R2R2中存放字节数,程序框图如中存放字节数,程序框图如图图4-14-1所示。所示。n程序如下:程序如下:MOV R2MOV R2,n n;n n为要比较的数据字节数为要比较的数据字节数MOV AMOV A,R0R0;存

46、首地址指针;存首地址指针图图4-1 4-1 查找单字节无符号最大数程序框图查找单字节无符号最大数程序框图MOVMOVR1R1,A ADEC R2DEC R2;MOV AMOV A,R1 R1 LOOP:LOOP:MOVMOVR3R3,A A DECDECR1R1 CLRCLRC C SUBBSUBBA A,R1R1;两个数比较;两个数比较 JNCJNCLOOP1LOOP1;C=0C=0,A A中的数大,跳中的数大,跳LOOP1LOOP1 MOVMOVA A,R1R1;C=1C=1,则大数送,则大数送A A SJMPSJMPLOOP2LOOP2LOOP1:LOOP1:MOVMOVA A,R3 R

47、3 LOOP2:LOOP2:DJNZDJNZR2,LOOPR2,LOOP;是否比较结束?;是否比较结束?MOVMOVR0R0,A A;存最大数;存最大数 RET RET 4.3.6 4.3.6 数据排序程序设计数据排序程序设计n升序排,降序排升序排,降序排。仅介绍无符号数据。仅介绍无符号数据升序排升序排。n冒泡法:冒泡法:相邻数互换的排序方法,类似水中气泡上浮相邻数互换的排序方法,类似水中气泡上浮 。排排序时序时从前向后进行相邻两个数的比较,次序与要求的顺序不从前向后进行相邻两个数的比较,次序与要求的顺序不符时,就将两个数互换;顺序符合要求不互换。符时,就将两个数互换;顺序符合要求不互换。n假

48、设有假设有7 7个原始数据的排列顺序为:个原始数据的排列顺序为:6 6、4 4、1 1、2 2、5 5、7 7、3 3。第一次冒泡的过程是第一次冒泡的过程是:6 6、4 4、1 1、2 2、5 5、7 7、3 3 ;原始数据的排列;原始数据的排列4 4、6 6、1 1、2 2、5 5、7 7、3 3 ;逆序,互换;逆序,互换4 4、1 1、6 6、2 2、5 5、7 7、3 3 ;逆序,互换;逆序,互换 4 4、1 1、2 2、6 6、5 5、7 7、3 3 ;逆序,互换;逆序,互换4 4、1 1、2 2、5 5、6 6、7 7、3 3 ;逆序,互换;逆序,互换4 4、1 1、2 2、5 5、

49、6 6、7 7、3 3;正序,不互换;正序,不互换4 4、1 1、2 2、5 5、6 6、3 3、7 7 ;逆序,互换,第一次冒泡结束;逆序,互换,第一次冒泡结束如此进行,各次冒泡的结果如下如此进行,各次冒泡的结果如下:第第1 1次冒泡结果:次冒泡结果:4 4、1 1、2 2、5 5、6 6、3 3、7 7第第2 2次冒泡结果:次冒泡结果:1 1、2 2、4 4、5 5、3 3、6 6、7 7第第3 3次冒泡结果:次冒泡结果:1 1、2 2、4 4、3 3、5 5、6 6、7 7第第4 4次冒泡结果:次冒泡结果:1 1、2 2、3 3、4 4、5 5、6 6、7 7;已完成排序;已完成排序第第5 5次冒泡结果:次冒泡结果:1 1、2 2、3 3、4 4、5 5、6 6、7 7第第6 6次冒泡结果:次冒泡结果:1 1、2 2、3 3、4 4、5 5、6 6、7 7 对于对于n n个数,理论上应进行(个数,理论上应进行(n-1n-1)次冒泡,有时不到()次冒泡,有时不到(n-1n-1)次就已完成排序次就已完成排序 。n如何判定如何判定排序是否已完成排序是否已完成,看各次冒泡中是,看各次冒泡中是否有互换发生否有互换发生,如有数据互换,则排序未完成。如有数据互换,则排序未完成。n在程序设计中,常使用在程序设计中,常使用设置互换标志设置互换标志的方法,该标志的状态的方法,该标志的状态表示在

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服