汇编语言程序设计方案ppt课件

上传人:m**** 文档编号:580615056 上传时间:2024-08-29 格式:PPT 页数:74 大小:670KB
返回 下载 相关 举报
汇编语言程序设计方案ppt课件_第1页
第1页 / 共74页
汇编语言程序设计方案ppt课件_第2页
第2页 / 共74页
汇编语言程序设计方案ppt课件_第3页
第3页 / 共74页
汇编语言程序设计方案ppt课件_第4页
第4页 / 共74页
汇编语言程序设计方案ppt课件_第5页
第5页 / 共74页
点击查看更多>>
资源描述

《汇编语言程序设计方案ppt课件》由会员分享,可在线阅读,更多相关《汇编语言程序设计方案ppt课件(74页珍藏版)》请在金锄头文库上搜索。

1、第第4 4章章 AT89S51AT89S51汇编言语汇编言语程序设计程序设计成都理工大学工程技术学院成都理工大学工程技术学院自动化工程系自动化工程系第第4章章目目录4.1汇编言言语程序程序设计概述概述4.1.1单片机片机编程言程言语4.1.2汇编言言语语句和格式句和格式4.1.3伪指令指令4.2汇编言言语源程序的源程序的汇编4.2.1手工手工汇编4.2.2机器机器汇编4.3AT89S51汇编汇编言言语语程序程序设计举设计举例例4.3.1子程序的子程序的设计设计4.3.2查查表程序表程序设计设计4.3.3关关键键字字查查找程序找程序设计设计4.3.4数据极数据极值查值查找程序找程序设计设计4.3

2、.5数据排序程序数据排序程序设计设计4.3.6分支分支转转移程序移程序设计设计4.3.7循循环环程序程序设计设计内容概要内容概要汇编言语能直接控制单片机硬件的编程言语。汇编言语能直接控制单片机硬件的编程言语。因此,要求程序设计者要因此,要求程序设计者要 “ “软、硬结合软、硬结合 。本章引见汇编言语程序设计的根本知识本章引见汇编言语程序设计的根本知识, ,以及一些根本的以及一些根本的程序设计。程序设计。4.1 4.1 汇编言语程序设计概述汇编言语程序设计概述程序是指令的有序集合。程序是指令的有序集合。单片机运转就是执行指令序列的过程。单片机运转就是执行指令序列的过程。编写这一指令序列的过程称为

3、程序设计。编写这一指令序列的过程称为程序设计。4.1.1单单片机片机编编程言程言语语常用的常用的编编程言程言语语是是汇编汇编言言语语和高和高级级言言语语。1 1汇编汇编言言语语用英文字符来替代机器言用英文字符来替代机器言语语,这这些英文字符被称些英文字符被称为为助助记记符符汇汇编编言言语语:用助:用助记记符表示的指令。符表示的指令。汇编汇编言言语语源程序:用源程序:用汇编汇编言言语编语编写的程序。写的程序。“汇编汇编:汇编汇编言言语语源程序需源程序需转换转换 翻翻译译 成成为为二二进进制代制代码码表表示的机器言示的机器言语语程序,才干程序,才干识别识别和和执执行。行。完成完成“翻翻译译的程序称

4、的程序称为汇编为汇编程序。程序。经汇编经汇编程序程序“汇编汇编得得到的以到的以“0“0、“1“1代代码码方式表示的机器言方式表示的机器言语语程序称程序称为为目的目的程序。程序。优点:用汇编言语编写程序效率高,占用存储空间小,运转优点:用汇编言语编写程序效率高,占用存储空间小,运转速度快,能编写出最优化的程序,速度快,能编写出最优化的程序,缺陷:可读性差,离不开详细的硬件,是面向缺陷:可读性差,离不开详细的硬件,是面向“硬件的言硬件的言语通用性差。语通用性差。2 2高级言语高级言语不受详细不受详细“硬件的限制,优点:通用性强,直观、易懂、硬件的限制,优点:通用性强,直观、易懂、易学,可读性好。易

5、学,可读性好。目前多数的目前多数的5151单片机用户运用单片机用户运用C C言语言语C51C51来进展程序设计,来进展程序设计,已公以为高级言语中高效简约而又贴近已公以为高级言语中高效简约而又贴近5151单片机硬件的编程言单片机硬件的编程言语。语。将将C C言语向单片机上移植,始于言语向单片机上移植,始于2020世纪世纪8080年代的中后期。年代的中后期。经过十几年努力,经过十几年努力,C51C51已成为单片机的适用高级编程言语。已成为单片机的适用高级编程言语。虽然目前已有不少设计人员运用虽然目前已有不少设计人员运用C51C51来进展程序开发,但在对来进展程序开发,但在对程序的空间和时间要求较

6、高的场所,汇编言语仍必不可少。程序的空间和时间要求较高的场所,汇编言语仍必不可少。在这种场所下,可运用在这种场所下,可运用C C言语和汇编言语混合编程。在很多需言语和汇编言语混合编程。在很多需求直接控制硬件且对实时性要求较高的场所,那么更是非用汇求直接控制硬件且对实时性要求较高的场所,那么更是非用汇编言语不可。编言语不可。掌握汇编言语并能进展程序设计,是学习和掌握单片机程序掌握汇编言语并能进展程序设计,是学习和掌握单片机程序设计的根本功之一。设计的根本功之一。4.1.2 4.1.2 汇编言语语句和格式汇编言语语句和格式两种根本语句:指令语句和伪指令语句。两种根本语句:指令语句和伪指令语句。1

7、1指令语句指令语句已在第已在第3 3章引见。每一指令语句在汇编时都产生一个指令代码章引见。每一指令语句在汇编时都产生一个指令代码机器代码,执行该指令代码对应着机器的一种操作。机器代码,执行该指令代码对应着机器的一种操作。2 2伪指令语句伪指令语句是控制汇编翻译过程的一些控制命令。在汇编时没有机器是控制汇编翻译过程的一些控制命令。在汇编时没有机器代码与之对应。代码与之对应。下面引见指令语句格式。伪指令语句将在下面引见指令语句格式。伪指令语句将在4.1.34.1.3节引见。节引见。汇编言语语句是符合典型的汇编言语的四分段格式:汇编言语语句是符合典型的汇编言语的四分段格式:标号字段和操作码字段之间要

8、有冒号标号字段和操作码字段之间要有冒号“:分隔;:分隔;操作码字段和操作数字段间的分界符是空格;操作码字段和操作数字段间的分界符是空格;双操作数之间用逗号相隔;双操作数之间用逗号相隔;操作数字段和注释字段之间的分界符用分号操作数字段和注释字段之间的分界符用分号“;。;。任何语句都必需有操作码字段,其他各段为任选项。任何语句都必需有操作码字段,其他各段为任选项。标号字段标号字段(LABLE)操作码字段操作码字段(OPCODE)操作数字段操作数字段(OPRAND)注释字段注释字段(COMMENT)【例【例4-1】下面是一段程序的四分段】下面是一段程序的四分段书书写格式。写格式。标标号字段号字段操作

9、操作码码字段字段操作数字段操作数字段注注释释字段字段START:MOV A,#00H;0AMOV R1,#10;10R1MOV R2,#00000011B ;03HR2LOOP:ADD A,R2 ;(A)+(R2)ADJNZ R1,LOOP;R1减减1不不为为零,那么跳零,那么跳LOOP处处NOPHERE:SJMPHERE上述上述4个字段个字段应该应该遵守的根本遵守的根本语语法法规规那么如下。那么如下。1 1标标号字段号字段语语句所在地址的句所在地址的标标志符号,才干被志符号,才干被访问访问。如。如标标号号“START“START和和“LOOP“LOOP等。有关等。有关标标号号规规定如下:定如

10、下: 1 1 标标号后必需跟冒号号后必需跟冒号“:。:。 2 2 标标号由号由1 18 8个个ASCIIASCII码码字符字符组组成,第一个字符必需是字成,第一个字符必需是字母。母。 3 3 同一同一标标号在一个程序中只能定号在一个程序中只能定义义一次,不能反复定一次,不能反复定义义。 4 4 不能运用不能运用汇编汇编言言语语曾曾经经定定义义的符号作的符号作为标为标号,如指令助号,如指令助记记符、符、伪伪指令以及存放器的符号称号等。指令以及存放器的符号称号等。 5 5 标标号的有无,取决于本程序中的其他号的有无,取决于本程序中的其他语语句能否句能否访访问该条语句。如无其他语句访问,那么该语句前

11、不需标号。问该条语句。如无其他语句访问,那么该语句前不需标号。2 2操作码字段操作码字段操作码字段规定了语句执行的操作,操作码是汇编言语指令中操作码字段规定了语句执行的操作,操作码是汇编言语指令中独一不能空缺的部分。独一不能空缺的部分。3 3操作数字段操作数字段指令的操作数或操作数地址。指令的操作数或操作数地址。在本字段中,操作数的个数因指令的不同而不同。通常有单操在本字段中,操作数的个数因指令的不同而不同。通常有单操作数、双操作数和无操作数三种情况。作数、双操作数和无操作数三种情况。假设是多操作数,那么操作数之间要以逗号隔开。假设是多操作数,那么操作数之间要以逗号隔开。操作数表示时,几种情况

12、需留意:操作数表示时,几种情况需留意:1 1十六进制、二进制和十进制方式的操作数表示十六进制、二进制和十进制方式的操作数表示多数情况,操作数或操作数地址是采用十六进制方式来表多数情况,操作数或操作数地址是采用十六进制方式来表示的。那么需加后缀示的。那么需加后缀“H“H。在某些特殊场所用二进制表示,需加后缀在某些特殊场所用二进制表示,需加后缀“B“B假设操作数采用十进制方式,那么需加后缀假设操作数采用十进制方式,那么需加后缀“D“D,也可省,也可省略。略。假设十六进制操作数以字符假设十六进制操作数以字符A AF F开头,需在它前面加一个开头,需在它前面加一个 “0 “0,以便汇编时把它和字符,以

13、便汇编时把它和字符A AF F区别开。区别开。2 2任务存放器和特殊功能存放器的表示任务存放器和特殊功能存放器的表示 当操作数为任务存放器或特殊功能存放器时,允许用当操作数为任务存放器或特殊功能存放器时,允许用任务存放器和特殊功能存放器的代号表示。任务存放器和特殊功能存放器的代号表示。 例如,任务存放器用例如,任务存放器用R7R7R0R0,累加器用,累加器用A A或或AccAcc表表示。另外,任务存放器和特殊功能存放器也可用其地址来示。另外,任务存放器和特殊功能存放器也可用其地址来表示,如累加器表示,如累加器A A可用其地址可用其地址E0HE0H来表示。来表示。4 4注释字段注释字段用于解释指

14、令或程序的含义,对可读性非常有用。用于解释指令或程序的含义,对可读性非常有用。运用时须以分号开头,长度不限,一行写不下可换行运用时须以分号开头,长度不限,一行写不下可换行书写,但留意也要以分号开头。书写,但留意也要以分号开头。 汇编时,遇到汇编时,遇到“; 就停顿就停顿“翻译。因此,注释字翻译。因此,注释字段不会产活力器代码。段不会产活力器代码。4.1.3 4.1.3 伪指令伪指令 在汇编言语源程序中应有向汇编程序发出的指示信息,在汇编言语源程序中应有向汇编程序发出的指示信息,通知它如何完成汇编任务,这是经过伪指令来实现。通知它如何完成汇编任务,这是经过伪指令来实现。 伪指令不属于指令系统中的

15、汇编言语指令,它是程序员伪指令不属于指令系统中的汇编言语指令,它是程序员发给汇编程序的命令,也称为汇编程序控制命令。发给汇编程序的命令,也称为汇编程序控制命令。 只需在汇编前的源程序中才有伪指令。只需在汇编前的源程序中才有伪指令。 “ “伪表达在伪表达在汇编后,伪指令没有相应的机器代码产生。汇编后,伪指令没有相应的机器代码产生。 伪指令具有控制汇编程序的输入伪指令具有控制汇编程序的输入/ /输出、定义数据和符输出、定义数据和符号、条件汇编、分配存储空间等功能。号、条件汇编、分配存储空间等功能。不同汇编言语的伪指令有所不同,但根本内容一样。不同汇编言语的伪指令有所不同,但根本内容一样。引见常用的

16、伪指令。引见常用的伪指令。1 1ORGORGORiGinORiGin汇编起始地址命令汇编起始地址命令源程序的开场,用一条源程序的开场,用一条ORGORG伪指令规定程序的起始地址。伪指令规定程序的起始地址。假设不用假设不用ORGORG,那么汇编得到的目的程序将从,那么汇编得到的目的程序将从0000H0000H地址开地址开场。例如:场。例如:ORGORG2000H2000HSTARTSTART:MOVMOVA A,#00H#00H 即规定标号即规定标号STARTSTART代表地址为代表地址为2000H2000H开场。开场。在一源程序中,可多次用在一源程序中,可多次用ORGORG指令,规定不同的程序

17、段的起指令,规定不同的程序段的起始地址。但是,地址必需由小到大陈列,且不能交叉、始地址。但是,地址必需由小到大陈列,且不能交叉、重叠。例如:重叠。例如:ORGORG2000H2000HORGORG2500H2500HORGORG3000H3000H这种顺序是正确的。假设按下面顺序的陈列那么是错误的,这种顺序是正确的。假设按下面顺序的陈列那么是错误的,由于地址出现了交叉。由于地址出现了交叉。ORGORG2500H2500HORGORG2000H2000HORGORG3000H3000H2. 2. END(END of Assembly)END(END of Assembly)汇编终汇编终止命令止

18、命令源程序源程序终终了了标标志,志,终终止源程序的止源程序的汇编汇编任任务务。整个源程序。整个源程序中只能有一条中只能有一条ENDEND命令,且位于程序的最后。假命令,且位于程序的最后。假设设ENDEND出如出如今程序中今程序中间间,其后的源程序,将不,其后的源程序,将不进进展展汇编处汇编处置。置。3 3EQUEQU EQUateEQUate 标标号号赋值赋值命令命令用于用于给标给标号号赋值赋值。赋值赋值后,后,标标号号值值在整个程序有效。在整个程序有效。例如:例如:TESTTEST: EQU 2000HEQU 2000H表示表示TEST=2000HTEST=2000H,汇编时汇编时,凡是遇到

19、,凡是遇到TESTTEST时时,均以,均以2000H2000H来替代。来替代。4DB DefineByte 定定义义数据字数据字节节命令命令用于从指定的地址开用于从指定的地址开场场,在程序存,在程序存储储器延器延续单续单元中定元中定义义字字节节数据。例如:数据。例如:ORG 2000HDB30H,40H,24,C,B汇编汇编后后(2000H)=30H(2001H)=40H(2002H)=18H(十十进进制数制数24)(2003H)=43H(字符字符“C的的ASCII码码)(2004H)=42H(字符字符“B的的ASCII码码)显然,显然,DB功能是从指定单元开场定义存储假设干字节,功能是从指定

20、单元开场定义存储假设干字节,十进制数自然转换成十六进制数,字母按十进制数自然转换成十六进制数,字母按ASCII码存储。码存储。5DWDefineWord定义数据字命令定义数据字命令该命令用于从指定的地址开场,在程序存储器的延续单元中该命令用于从指定的地址开场,在程序存储器的延续单元中定义定义16位的数据字。例如:位的数据字。例如:ORG 2000HDW1246H,7BH,10汇编后汇编后(2000H)=12H;第;第1个字个字(2001H)=46H(2002H)=00H;第;第2个字个字(2003H)=7BH(2004H)=00H;第;第3个字个字(2005H)=0AH6DSDefineSto

21、rage定义存储区命令定义存储区命令从指定地址开场,保管指定数目的字节单元作为存储区,供程序运转从指定地址开场,保管指定数目的字节单元作为存储区,供程序运转运用。例如:运用。例如:TABEL:DS10表示从表示从TABEL代表的地址开场,保管代表的地址开场,保管10个延续的地址单元。又例如:个延续的地址单元。又例如:ORG2000HDS10H表示从表示从2000H地址开场,保管地址开场,保管16个延续地址单元。个延续地址单元。留意:留意:DBDB、DWDW和和DSDS命令只能对程序存储器有效,不能对命令只能对程序存储器有效,不能对数据存储器运用。数据存储器运用。7 7BIT BIT 位定义命令

22、位定义命令用于给字符称号赋以位地址,位地址可以是绝对位地用于给字符称号赋以位地址,位地址可以是绝对位地址,也可是符号地址。例如:址,也可是符号地址。例如:QAQABIT P1.6BIT P1.6功能是把功能是把P1.6P1.6的位地址赋给变量的位地址赋给变量QAQA。4.2 4.2 汇编言语源程序的汇编汇编言语源程序的汇编“汇编汇编-可分为手工汇编和机器汇编两类。可分为手工汇编和机器汇编两类。4.2.1 4.2.1 手工手工汇编汇编 经过查经过查指令的机器代指令的机器代码码表表 表表3-23-2 ,逐个把助,逐个把助记记符指令符指令“翻翻译译成机器代成机器代码码,再,再进进展展调试调试和运和运

23、转转。 手工手工汇编汇编遇到相遇到相对转对转移偏移量的移偏移量的计计算算时时,较费较费事,易出事,易出错错,只需小程序或受条件限制,只需小程序或受条件限制时时才运用。才运用。实实践中,多采用践中,多采用“汇汇编编程序来自程序来自动动完成完成汇编汇编。4.2.2 4.2.2 机器机器汇编汇编 用微型用微型计计算机上的算机上的软软件件( (汇编汇编程序程序) )来替代手工来替代手工汇编汇编。在微。在微机上用机上用编辑软编辑软件件进进展源程序展源程序编辑编辑,然后生成一个,然后生成一个ASCIIASCII码码文件,文件,扩扩展名展名为为 “.ASM “.ASM。在微机上运。在微机上运转汇编转汇编程序

24、,程序,译译成机器成机器码码。 机器机器码经过码经过微机的串口微机的串口 或并口或并口 传传送到用送到用户样户样机机 或在或在线线仿仿真器真器 ,进进展程序的展程序的调试调试和运和运转转。 有有时时,在分析某些,在分析某些产产品的程序的机器代品的程序的机器代码时码时,需将机器代,需将机器代码码翻翻译译成成汇编汇编言言语语源程序,称源程序,称为为“反反汇编汇编。【例【例4-2】表表4-1是一段源程序的汇编结果,可查表是一段源程序的汇编结果,可查表3-2,手,手工汇编,来验证下面的汇编结果能否正确。机器码从工汇编,来验证下面的汇编结果能否正确。机器码从1000H单单元开场存放。元开场存放。4.3

25、AT89S514.3 AT89S51汇编言语程序设计举例汇编言语程序设计举例 引见常用的汇编言语程序的设计。引见常用的汇编言语程序的设计。4.3.1 4.3.1 子程序的设计子程序的设计 将那些需多次运用的、完成一样的某种根本运算或操作将那些需多次运用的、完成一样的某种根本运算或操作的程序段从整个程序中独立出来,单独编成一个程序段,的程序段从整个程序中独立出来,单独编成一个程序段,需求时进展调用。这样的程序段称为子程序。需求时进展调用。这样的程序段称为子程序。 优点:采用子程序可使程序构造简单,缩短程序的设计优点:采用子程序可使程序构造简单,缩短程序的设计时间,减少占用的程序存储空间。时间,减

26、少占用的程序存储空间。 子程序在程序设计中非常重要,读者应熟练掌握子程序子程序在程序设计中非常重要,读者应熟练掌握子程序的设计方法。的设计方法。1 1子程序的子程序的设计设计原那么和原那么和应应留意的留意的问题问题编编写子程序写子程序应应留意以下留意以下问题问题: 1 1 子程序的入口地址,前必需有子程序的入口地址,前必需有标标号。号。 2 2 主程序主程序调调用子程序,是用子程序,是经过调经过调用指令来用指令来实现实现。有两条子。有两条子程序程序调调用指令:用指令: 绝对调绝对调用指令用指令ACALL addr11ACALL addr11。双字。双字节节,addr11addr11指出了指出了

27、调调用的目的地址,用的目的地址,PCPC中中1616位地址中的高位地址中的高5 5位不位不变变,被,被调调用的用的子程序的首地址与子程序的首地址与绝对调绝对调用指令的下一条指令的高用指令的下一条指令的高5 5位地址位地址一一样样,即只能在同一个,即只能在同一个2KB2KB区内。区内。 长调长调用指令用指令LCALL addr16LCALL addr16。三字。三字节节,addr16addr16为为直接直接调调用的目的地址,子程序可放在用的目的地址,子程序可放在64KB64KB程序存程序存储储器区恣意位置。器区恣意位置。3 3子程序构造中必需用到堆栈,用来进展断点和现场的维子程序构造中必需用到堆

28、栈,用来进展断点和现场的维护。护。4 4子程序前往主程序时,最后一条指令必需是子程序前往主程序时,最后一条指令必需是RETRET指令,指令,功能是把堆栈中的断点地址弹出送入功能是把堆栈中的断点地址弹出送入PCPC指针中,从而实现子程指针中,从而实现子程序前往后从主程序断点处继续执行主程序。序前往后从主程序断点处继续执行主程序。5 5子程序可以嵌套,即主程序可以调用子程序,子程序又子程序可以嵌套,即主程序可以调用子程序,子程序又可以调用另外的子程序。可以调用另外的子程序。2子程序的根本构造子程序的根本构造典型的子程序的根本构造如下:典型的子程序的根本构造如下:MAIN:;MAIN为为主程序入口主

29、程序入口标标号号LCALLSUB;调调用子程序用子程序SUB子程序子程序SUB: PUSHPSW ;现场维护现场维护 PUSHAccPOP Acc;现场现场恢复,留意要先恢复,留意要先进进后出后出POP PSWRET;最后一条指令必需;最后一条指令必需为为RET子程序处置程序段子程序子程序 留意:上述子程序构造中,现场维护与现场恢复不是必需留意:上述子程序构造中,现场维护与现场恢复不是必需的,要根据实践情况而定。的,要根据实践情况而定。4.3.2 4.3.2 查表程序设计查表程序设计 查表程序是一种常用程序查表程序是一种常用程序, ,防止复杂的运算或转换过程,防止复杂的运算或转换过程,可完成数

30、据补偿、修正、计算、转换等各种功能,具有程序简可完成数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。单、执行速度快等优点。 查表是根据自变量查表是根据自变量x x,在表格寻觅,在表格寻觅y y,使,使y =f(x)y =f(x)。单片机。单片机中,数据表格存放于程序存储器内,在执行查表指令时,发出中,数据表格存放于程序存储器内,在执行查表指令时,发出读程序存储器选通脉冲读程序存储器选通脉冲 。两条极为有用的查表指令如下:。两条极为有用的查表指令如下:1 1MOVC MOVC A A,A+DPTRA+DPTR2 2MOVC MOVC A A,A+PCA+PC两条指令的功能完

31、全一样,详细运用有差别。两条指令的功能完全一样,详细运用有差别。指令指令“MOVC A“MOVC A,A+DPTRA+DPTR 把把A A中内容与中内容与DPTRDPTR中的内容相加,中的内容相加,结果为某一程序存储单元的地址,然后把该地址单元的内容送结果为某一程序存储单元的地址,然后把该地址单元的内容送到到A A中。中。指令指令“MOVC A“MOVC A,A+PCA+PC ,PCPC的内容与的内容与A A的内容相加后所得的内容相加后所得的数作为某一程序存储器单元的地址,根据地址取出程序存储的数作为某一程序存储器单元的地址,根据地址取出程序存储器相应单元中的内容送到累加器器相应单元中的内容送

32、到累加器A A,指令执行后,指令执行后,PCPC的内容不发的内容不发生变化,仍指向该查表指令的下一条指令。生变化,仍指向该查表指令的下一条指令。优点:在于预处置较少且不影响其他特殊功能存放器的值,优点:在于预处置较少且不影响其他特殊功能存放器的值,不用维护其他特殊功能存放器。不用维护其他特殊功能存放器。缺陷:在于该表格只能存放在这条指令的地址缺陷:在于该表格只能存放在这条指令的地址X3X2X1X0X3X2X1X0以下以下00H00HFFHFFH之中,即只能存放在地址范围之中,即只能存放在地址范围X3X2X1X0+1X3X2X1X0+1X3X2X1X0+100HX3X2X1X0+100H中,这就

33、使得表格所在的程序空间遭到了中,这就使得表格所在的程序空间遭到了限制。限制。下面阐明查表指令的用法和计算偏移量应留意的问题。下面阐明查表指令的用法和计算偏移量应留意的问题。【例【例4-3】设计设计一子程序,功能是根据累加器一子程序,功能是根据累加器A中的数中的数x 09之之间间 查查x的平方表的平方表y,根据,根据x的的值查值查出相出相应应的平方的平方y。本例中的。本例中的x和和y均均为单为单字字节节数。数。地地址址子程序子程序Y3Y2Y1Y0ADDA,#01HY3Y2Y1Y0+2MOVCA,A+PCY3Y2Y1Y0+3RETY3Y2Y1Y0+4DB00H,01H,04H,09H,10HDB1

34、9H,24H,31H,40H,51H;数;数09的平方表的平方表指令指令“ADD A“ADD A,#01H#01H的作用是的作用是A A中的内容加上中的内容加上 “01H “01H, “01H “01H即为查表指令与平方表之间的即为查表指令与平方表之间的“RET“RET指令指令所占的字节数。加上所占的字节数。加上 “01H “01H后,可保证后,可保证PCPC指向表首,累指向表首,累加器加器A A中原来的内容仅是从表首开场向下查找多少个单元。中原来的内容仅是从表首开场向下查找多少个单元。在进入程序前,在进入程序前,A A的内容在的内容在000009H09H之间,如之间,如A A中的内容中的内容

35、为为02H02H,它的平方为,它的平方为04H04H,可根据,可根据A A的内容查出的内容查出x x的平方的平方指令指令“MOVC A“MOVC A,A+DPTRA+DPTR 运用范围较广,运用该指运用范围较广,运用该指令时不用计算偏移量,优点是表格可以设在令时不用计算偏移量,优点是表格可以设在64KB64KB程序存储程序存储器空间内的任何地方,而不像器空间内的任何地方,而不像“MOVC A“MOVC A,A+PCA+PC那样只那样只设在设在PCPC下面的下面的256256个单元中,所以运用较方便。个单元中,所以运用较方便。假设DPTR已被运用,那么在查表前必需维护DPTR,且终了后恢复DPT

36、R,例4-3可改成如下方式:PUSH DPH ;保管DPH PUSH DPL ;保管DPLMOV DPTR,#TAB1MOVC A,A+DPTRPOP DPL ;恢复DPLPOP DPH ;恢复DPHRETTAB1: DB 00H,01H,04H,09H,10H;平方表DB 19H,24H,31H,40H,51H实践查表,有时x为单字节数,y为双字节数。来看下例。【例【例4-4】有一巡回】有一巡回检测报检测报警安装,需警安装,需对对16路路 x 输输入入进进展展检测检测,每路有一个最大允,每路有一个最大允许值许值 y ,为为双字双字节节数。需根据数。需根据丈量的路数丈量的路数 x ,查查表找出

37、表找出对应该对应该路的最大允路的最大允许值许值 y ,看,看输输入入值值能否大于最大允能否大于最大允许值许值,假,假设设大于就大于就报报警。警。取路数取路数为为x 0x15 ,y为为最大允最大允许值许值,放在表格中。,放在表格中。设设进进入入查查表程序前,假表程序前,假设设路数路数x已放于已放于R2中,中,查查表后表后该该路的路的最大允最大允许值许值y放于放于R3R4中。中。查查表的程序如下:表的程序如下:TB3: MOV A,R2ADDA,R2;(R2)*2(A)MOVR3,A;保管指针ADDA,#6;加偏移量MOVCA,A+PC;查第一字节XCH A,R3ADD A,#3MOVCA,A+P

38、C;查第二字节MOVR4,ARETTAB3: DW1520,3721,42645,7580;最大值表DW3483,32657,883,9943DW10000,40511,6758,8931DW4468,5871,13284,27808表格长度不能超越表格长度不能超越256B256B,且表格只能存放于,且表格只能存放于“MOVC A“MOVC A,A+PCA+PC指令以下的指令以下的256256个单元中,如需把表格放在程序存储个单元中,如需把表格放在程序存储器空间的任何地方,应运用指令器空间的任何地方,应运用指令“ MOVC A“ MOVC A,A+DPTRA+DPTR。【例【例4-54-5】

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

40、2R3R2R3中。参考程中。参考程序:序:LTB2:MOVDPTR,#TAB2MOVA,R3CLRCRLCAMOVR3,AXCHA,R2RLCAXCHR2,AADDA,DPL;(R2R3)+(DPTR)(DPTR)MOVDPL,AMOVA,DPHADDCA,R2MOVDPH,ACLRAMOVCA,A+DPTR;查第一字节MOV R2,A;第一字节存入R2中CLRAINCDPTRMOVCA,A+DPTR;查第二字节MOV R3,A;第二字节存入R3中RETTAB2:DW,;温度值表由于运用了指令“MOVCA,A+DPTR,表TAB2可放入64KB程序存储器空间任何位置,表格的长度可大于256B。

41、4.3.3关关键键字字查查找程序找程序设计设计在表中在表中查查找关找关键键字的操作,也称字的操作,也称为为数据数据检检索。有两种方索。有两种方法,即法,即顺顺序序检检索和索和对对分分检检索。索。1顺顺序序检检索索要要检检索的表是无序的,索的表是无序的,检检索索时时只能从第只能从第1项项开开场场逐逐项查项查找,判找,判别别所取数据能否与关所取数据能否与关键键字相等。字相等。【例【例4-6】从从50个字个字节节的无序表中的无序表中查查找一个关找一个关键键字字“xxH。ORG1000HMOV30H,#xxH ;关;关键键字字xxH送送30H单单元元MOVR1,#50;查查找次数送找次数送R1MOVA

42、,#14H;修正;修正值值送送AMOVDPTR,#TAB4;表首地址送;表首地址送DPTRLOOP: PUSHAccMOVCA,A+PC;查表结果送ACJNEA,30H,LOOP1;(30H)不等于关键字那么转LOOP1MOVR2,DPH;查到关键字,把地址送R2,R3MOVR3,DPLDONE: RETLOOP1:POP Acc;修正值弹出INC A;A+1AINC DPTR;修正数据指针DPTRDJNZR1,LOOP;R10,未查完,继续查找MOVR2,#00H;R1=0,R2和R3清0MOVR3,#00H;表中50个数已查完AJMPDONE;从子程序前往TAB4:DB,;50个无序数据表

43、2对分检索对分检索对分检索的前提是检索的数据表曾经排好序,以便于按对分检索的前提是检索的数据表曾经排好序,以便于按照对分原那么取数。如何进展数据排序,稍后引见。照对分原那么取数。如何进展数据排序,稍后引见。对分检索的方法:取数据表中间位置的数与关键字进展对分检索的方法:取数据表中间位置的数与关键字进展比较,如相等,那么查找终了。比较,如相等,那么查找终了。假设取数大于关键字,那么下次对分检索的范围是从数假设取数大于关键字,那么下次对分检索的范围是从数据区起点到本次取数处。据区起点到本次取数处。假设取数小于关键字,那么下次对分检索的范围是从本假设取数小于关键字,那么下次对分检索的范围是从本次取数

44、数据区起点到数据区终点。依此类推,逐渐减少检次取数数据区起点到数据区终点。依此类推,逐渐减少检索范围,减少次数,大大提高查找速度。索范围,减少次数,大大提高查找速度。4.3.4数据极值查找程序设计数据极值查找程序设计进展数值大小的比较,从一批数据中找出最大值或最小值并进展数值大小的比较,从一批数据中找出最大值或最小值并存于某一单元中。存于某一单元中。【例【例4-7】片内】片内RAM中存放一批数据,查找出最大值并存放于首中存放一批数据,查找出最大值并存放于首地址中。设地址中。设R0中存放首地址,中存放首地址,R2中存放字节数,程序框图见中存放字节数,程序框图见图图4-1。程序如下:。程序如下:M

45、OVR2,n;n为要比较的数据字节数为要比较的数据字节数MOVA,R0;存首地址指针;存首地址指针MOVR1,ADECR2MOVA,R1LOOP: MOV R3,ADEC R1CLR CSUBBA,R1;两个数比较JNCLOOP1;C=0,A中数大,跳LOOP1MOVA,R1;C=1,那么大数送ASJMPLOOP2LOOP1:MOV A,R3LOOP2:DJNZ R2,LOOP;能否比较终了?MOV R0,A;存最大数RET4.3.5数据排序程序设计数据排序程序设计将一批数由小到大升序陈列,或由大到小降序陈将一批数由小到大升序陈列,或由大到小降序陈列。列。最常用的数据排序算法是冒泡法,是相邻数

46、互换的排序方最常用的数据排序算法是冒泡法,是相邻数互换的排序方法,因其过程类似水中气泡上浮,故称冒泡法。法,因其过程类似水中气泡上浮,故称冒泡法。排序时,从前向后进展相邻两个数的比较,假设数据的大排序时,从前向后进展相邻两个数的比较,假设数据的大小次序与要求的顺序不符时,就将两个数互换;否那么,顺小次序与要求的顺序不符时,就将两个数互换;否那么,顺序符合要求就不互换。假设进展升序排序,应经过这种相邻序符合要求就不互换。假设进展升序排序,应经过这种相邻数互换方法,使小数向前移,大数向后移。数互换方法,使小数向前移,大数向后移。如此从前向后进展一次次相邻数互换冒泡,就会把这如此从前向后进展一次次相

47、邻数互换冒泡,就会把这批数据的最大数排到最后,次大数排在倒数第二的位置,批数据的最大数排到最后,次大数排在倒数第二的位置,从而实现一批数据由小到大的陈列。假设有7个原始数据的陈列顺序为6、4、1、2、5、7、3。第一次冒泡的过程是:6、4、1、2、5、7、3;原始数据的陈列4、6、1、2、5、7、3;逆序,互换4、1、6、2、5、7、3;逆序,互换4、1、2、6、5、7、3;逆序,互换4、1、2、5、6、7、3;逆序,互换4、1、2、5、6、7、3;正序,不互换4、1、2、5、6、3、7;逆序,互换,第一次冒泡终了如此进展,各次冒泡的结果如下:如此进展,各次冒泡的结果如下:第第1次冒泡结果:次

48、冒泡结果:4、1、2、5、6、3、7第第2次冒泡结果:次冒泡结果:1、2、4、5、3、6、7第第3次冒泡结果:次冒泡结果:1、2、4、3、5、6、7第第4次冒泡结果:次冒泡结果:1、2、3、4、5、6、7;已完成排序;已完成排序第第5次冒泡结果:次冒泡结果:1、2、3、4、5、6、7第第6次冒泡结果:次冒泡结果:1、2、3、4、5、6、7对于对于n个数,实际上应进展个数,实际上应进展n-1次冒泡才干完成排序,次冒泡才干完成排序,实践上有时不到实践上有时不到n-1次就已完成排序。次就已完成排序。例如,上面的例如,上面的7个数,应进展个数,应进展6次冒泡,但实践上第次冒泡,但实践上第4次冒泡时次冒

49、泡时就曾经完成排序。就曾经完成排序。如何断定排序能否曾经完成?就是看各次冒泡中能否有互换发如何断定排序能否曾经完成?就是看各次冒泡中能否有互换发生,假设有,那么排序还没完成;否那么就表示曾经排好序。生,假设有,那么排序还没完成;否那么就表示曾经排好序。在程序设计中,常用设置互换标志的方法,用标志的形状表示在程序设计中,常用设置互换标志的方法,用标志的形状表示能否有互换进展。能否有互换进展。【例【例4-8】一批单字节无符号数,以】一批单字节无符号数,以R0为首地址指针,为首地址指针,R2中为中为字节数,将这批数进展升序陈列。程序框图如图字节数,将这批数进展升序陈列。程序框图如图4-2所示。程所示

50、。程序如下:序如下:SORT: MOVA,R0MOVR1,AMOVA,R2;字节数送入R5MOVR5,ACLR F0;互换标志位F0清0DEC R5MOVA,R1LOOP: MOVR3,AINCR1CLR CMOVA,R1;比较大小SUBBA,R3JNCLOOP1SETBF0;互换标志位F0置1MOVA,R3;XCH A,R1;两个数互换DECR1XCH A,R1INCR1LOOP1:MOVA,R1DJNZR5,LOOPJBF0,SORTRET图4-2 4-2 单字字节无符号数排序程序框无符号数排序程序框图4.3.6分支转移程序设计分支转移程序设计分为无条件转移和有条件转移。分为无条件转移和有

51、条件转移。无条件分支转移程序很简单,不讨论。有条件分支转移程序无条件分支转移程序很简单,不讨论。有条件分支转移程序按构造类型来分,又分为单分支选择构造和多分支选择构造。按构造类型来分,又分为单分支选择构造和多分支选择构造。1单分支选择构造单分支选择构造仅有两个出口,两者选一。普通根据运算结果的形状标志,仅有两个出口,两者选一。普通根据运算结果的形状标志,用条件判跳指令来选择并转移。用条件判跳指令来选择并转移。【例【例4-9】求单字节有符号数的二进制补码求单字节有符号数的二进制补码正数补码是其本身,负数补码是其反码加正数补码是其本身,负数补码是其反码加1。因此,应首先判。因此,应首先判被转换数的

52、符号,负数进展转换,正数本身即为补码。被转换数的符号,负数进展转换,正数本身即为补码。设二进制数放在A中,其补码放回到A中,框图如图4-3所示。参考程序如下:CMPT:JNBAcc.7,RETURN ;(A)0,不需转换MOVC,Acc.7;符号位保管CPLA;(A)求反,加1ADDA,#1MOVAcc.7,C;符号位存在A的最高位RETURN:RET图4-3 4-3 求求单字字节有符号二有符号二进制数制数补码的框的框图此外,单分支选择构造还有图4-4、图4-5所示的几种方式。图4-4 单分支选择构造2 图4-5 单分支选择构造32多分支选择构造多分支选择构造当程序的判别部分有两个以上的出口时

53、,为多分支选择当程序的判别部分有两个以上的出口时,为多分支选择构造。有两种方式,如图构造。有两种方式,如图4-6和图和图4-7所示。所示。 图4-6 4-6 多分支多分支选择构造构造1 1 图4-7 4-7 多分支多分支选择构造构造2 2指令系统提供了非常有用的两种多分支选择指令:指令系统提供了非常有用的两种多分支选择指令:间接转移指令间接转移指令 JMP A+DPTR JMP A+DPTR比较转移指令比较转移指令 CJNE A CJNE A,directdirect,relrel CJNE A CJNE A,#data#data,relrel CJNE Rn CJNE Rn,#data#da

54、ta,relrel CJNE Ri CJNE Ri,#data#data,relrel间接转移指令间接转移指令“JMP A+DPTR“JMP A+DPTR由数据指针由数据指针DPTRDPTR决议多决议多分支转移程序的首地址,由分支转移程序的首地址,由A A的内容选择对应分支。的内容选择对应分支。4 4条比较转移指令条比较转移指令CJNECJNE能对两个欲比较的单元内容进展能对两个欲比较的单元内容进展比较,当不相等时,程序实现相对转移;假设两者相等,比较,当不相等时,程序实现相对转移;假设两者相等,那么顺序往下执行。那么顺序往下执行。简单的分支转移程序的设计,常采用逐次比较法,就是把一切不同的情

55、况一个一个地进展比较,发现符合就转向对应的处置程序。缺陷是程序太长,有n种能够的情况,就需有n个判别和转移。【例4-10】求符号函数的值。符号函数定义如下:X存放在40H单元,Y存放在41H单元,如图4-6所示。Y=1X0X0X=00-1程序如下:程序如下:SIGNFUC:MOVA,40HCJNEA,#00H,NZEARAJMPNEGTNZEAR:JB Acc.7,POSIMOVA,#01HAJMP NEGTPOSI:MOV A,#81HNEGT:MOV 41H,AEND实践中,经常遇到图4-7的分支转移程序设计,典型例子就是当单片机系统中的键盘按下时,就会得到一个键值,根据不同的键值,跳向不

56、同的键处置程序入口。此时,可用直接转移指令LJMP或AJMP指令组成一个转移表,然后把该单元的内容读入累加器A,转移表首地址放入DPTR中,再利用间接转移指令实现分支转移。【例4-11】 根据存放器R2的内容,转向各个处置程序PRGXX=0n。(R2)=0,转PRG0(R2)=1,转PRG1 (R2)=n,转PRGn程序如下:JMP6: MOVDPTR,#TAB5 ;转移表首地址送DPTRMOV A,R2;分支转移参量送AMOV B,#03H;乘数3送BMUL AB ;分支转移参量乘3MOV R6, A;乘积的低8位暂存R6MOV A,B ;乘积的高8位送AADD A ,DPH ;乘积的高8位

57、加到DPH中MOV DPH, A MOV A, R6JMP A+DPTR;多分支转移选择 TAB5: LJMP PRG0;多分支转移表LJMP PRG1LJMP PRGnR2中的分支转移参量乘3是由于长跳转指令LJMP要占3个单元。本例程序可位于64KB程序存储器空间的任何区域。4.3.7循环程序设计程序中含有可以反复执行的程序段,称循环体。例如,求100个数的累加和,没必要延续安排100条加法指令,用一条加法指令使其循环执行100次。因此可缩短程序长度和程序所占的内存单元数量更少,使程序构造紧凑。1循环程序的构造循环程序的构造主要由以下四部分组成。主要由以下四部分组成。1循环初始化循环初始化

58、完成循环前的预备任务。例如,循环控制计数初值的设完成循环前的预备任务。例如,循环控制计数初值的设置、地址指针的起始地址的设置、为变量预置初值等。置、地址指针的起始地址的设置、为变量预置初值等。2循环处置循环处置完成实践的处置任务,反复循环执行的部分,故又称循完成实践的处置任务,反复循环执行的部分,故又称循环体。环体。3循环控制循环控制在反复执行循环体的过程中,不断修正循环控制变量,在反复执行循环体的过程中,不断修正循环控制变量,直到符合终了条件,就终了循环程序的执行。直到符合终了条件,就终了循环程序的执行。循环终了控制方法分为循环计数控制法和条件控制法。4循环终了这部分是对循环程序执行的结果进

59、展分析、处置和存放。2循环构造的控制分为循环计数控制构造和条件控制构造。图4-8是计数循环控制构造,图4-9是条件控制构造。图4-8计数循环控制构造图4-9条件控制构造1 1计数循环控制构造计数循环控制构造根据计数器的值来决议循环次数,普通为减根据计数器的值来决议循环次数,普通为减1 1计数器,计数器,计数器减到计数器减到“0“0时,终了循环。计数器初值在初始化设时,终了循环。计数器初值在初始化设定。定。MCS51MCS51指令系统提供了功能极强的循环控制指令:指令系统提供了功能极强的循环控制指令:DJNZ RnDJNZ Rn,relrel;以任务存放器作控制计;以任务存放器作控制计数器数器D

60、JNZ directDJNZ direct,relrel ;以直接寻址单元作控制计数器;以直接寻址单元作控制计数器例如,计算例如,计算n n个数据的和,计算公式为个数据的和,计算公式为 。如直接按公式编写程序,那么如直接按公式编写程序,那么n=100n=100时,需编写延续的时,需编写延续的100100次加法。这样程序将太长,并且次加法。这样程序将太长,并且n n可变时,将无法编写可变时,将无法编写出程序。出程序。公式要改写为用程序实现的方式,用下式表示程序框图见图4-10。图图4-10 4-10 求数据和的程序框图求数据和的程序框图【例【例4-12】求求n个单字节无符号数个单字节无符号数xi

61、的和,的和,xi按按i顺序存顺序存放在放在AT89S51单片机内部单片机内部RAM从从50H开场的单元中,开场的单元中,n放放在在R2中,和双字节放在中,和双字节放在R3R4中。中。程序如下:程序如下:ADD1:MOV R2,#n;加法次数;加法次数n送送R2MOVR3,#0;R3存放和的高存放和的高8位,初位,初始值为始值为0MOVR4,#0;R4存放和的低存放和的低8位,初位,初始值为始值为0MOVR0,#50HLOOP:MOVA,R4ADDA,R0MOVR4,AINC R0CLRAADDCA,R3MOVR3,ADJNZR2,LOOP;判加法循环次数能否已到?END用存放器R2作为计数控制

62、变量,R0作为变址单元,用它来寻址xi。普通来说,循环任务部分中的数据应该用间接方式来寻址,如这里用:ADDA,R0计数控制只需在循环次数知的情况下才适用。循环次数未知,不能用循环次数来控制,往往需求根据某种条件来判别能否应该终止循环。2 2条件控制构造条件控制构造构造见图构造见图4-94-9。循环控制中,设置一个条件,判能否满足该条。循环控制中,设置一个条件,判能否满足该条件,如满足,那么循环终了。如不满足该条件那么循环继续。件,如满足,那么循环终了。如不满足该条件那么循环继续。【例【例4-134-13】 一串字符,依次存放在内部一串字符,依次存放在内部RAMRAM从从30H30H单元开场的

63、单元开场的延续单元中,字符串以延续单元中,字符串以0AH0AH为终了标志,测试字符串长度。为终了标志,测试字符串长度。采用逐个字符依次与采用逐个字符依次与“0AH“0AH比较设置的条件的方法。设比较设置的条件的方法。设置一个累计字符串长度的长度计数器和一个用于指定字符串指针。置一个累计字符串长度的长度计数器和一个用于指定字符串指针。假设字符与假设字符与“0AH“0AH不等,那么长度计数器和字符串指针都加不等,那么长度计数器和字符串指针都加1 1;假设比较相等,那么表示该字符为;假设比较相等,那么表示该字符为“0AH“0AH,字符串终了,计,字符串终了,计数器值就是字符串的长度。程序如下:数器值

64、就是字符串的长度。程序如下:MOV R4,#0FFH ;长度计数器初值送R4MOVR1,#2FH;字符串指针初值送R1NEXT:INCR4INCR1CJNER1,#0AH,NEXT;比较,不等那么进展下一;字符比较END上面两例都是在一个循环程序中不再包含其他循环程序,那么称该循环程序为单循环程序。假设一个循环程序中包含了其他循环程序,那么称为多重循环程序。最常见的多重循环是由DJNZ指令构成的软件延时程序,是常用程序之一。【例【例4-14】50ms延延时时程序。程序。软软件延件延时时程序与指令程序与指令执执行行时间时间有很大的关系。在运用有很大的关系。在运用12MHz晶振晶振时时,一个机器周

65、期,一个机器周期为为1s,执执行一条行一条DJNZ指指令的令的时间为时间为2s。可用双重循。可用双重循环环方法的延方法的延时时50ms程序:程序:DEL:MOVR7,#200;本指令;本指令执执行行时间时间1sDEL1:MOVR6,#125;本指令;本指令执执行行时间时间1sDEL2:DJNZR6,DEL2;指令;指令执执行行1次次为为2s,计计;1252s=250s DJNZR7,DEL1;指令;指令执执行行时间时间2s,本,本循循环环体体;执执行行125次次RET;指令;指令执执行行时间时间2s以上延时程序不是太准确,如把一切指令的执行时间计算在内,它的延时时间为1+1+250+2 200+2s=50.603ms,如要求比较准确的延时,应对上述程序进展修正,才干到达较为准确的延时时间。但要留意,用软件实现延时程序,不允许有中断,否那么将严重影响定时的准确性。对于延时更长的时间,可采用多重的循环,如1s延时,可用三重循环。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号