第4章AT89S51汇编语言程序设计

上传人:人*** 文档编号:567481888 上传时间:2024-07-20 格式:PPT 页数:74 大小:637KB
返回 下载 相关 举报
第4章AT89S51汇编语言程序设计_第1页
第1页 / 共74页
第4章AT89S51汇编语言程序设计_第2页
第2页 / 共74页
第4章AT89S51汇编语言程序设计_第3页
第3页 / 共74页
第4章AT89S51汇编语言程序设计_第4页
第4页 / 共74页
第4章AT89S51汇编语言程序设计_第5页
第5页 / 共74页
点击查看更多>>
资源描述

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

1、第第4 4章章 AT89S51AT89S51汇编语言汇编语言程序设计程序设计1成都理工大学工程技术学院成都理工大学工程技术学院自动化工程系自动化工程系丈印宣臼兑绸椽玫纪欧绝解仁炊算销茅种浩庐莎淑悠磅瞻肃坟炳吵棵噎嗡第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计12第第4章章目目录录4.1汇编语汇编语言程序言程序设计设计概述概述4.1.1单片机编程语言4.1.2汇编语言语句和格式4.1.3伪指令4.2汇编语汇编语言源程序的言源程序的汇编汇编4.2.1手工汇编4.2.2机器汇编铜荆傣征捌堑鹤洗链灰艾析秉搂砖恍看伴秉危搁孰钻脱啦赃逊邻咎桩馏憎第4章AT89S51汇编语言程序

2、设计第4章AT89S51汇编语言程序设计24.3AT89S51汇编语汇编语言程序言程序设计举设计举例例4.3.1子程序的设计4.3.2查表程序设计4.3.3关键字查找程序设计4.3.4数据极值查找程序设计4.3.5数据排序程序设计4.3.6分支转移程序设计4.3.7循环程序设计斤助家敷鸳辆课迈吾绅市稠存秦拄痪罢讽嗅玲救私凌证称曙食田萎颜召浴第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计3内容概要内容概要汇编语言能汇编语言能直接控制单片机硬件直接控制单片机硬件的的编程语言编程语言。因此,要求程序设计者要因此,要求程序设计者要 “软、硬结合软、硬结合” 。本章介绍汇编语言

3、程序设计的本章介绍汇编语言程序设计的基本知识基本知识, ,以及一些以及一些基本的基本的程序设计程序设计。4.1汇编语言程序设计概述汇编语言程序设计概述程序是指令的有序集合。程序是指令的有序集合。单片机运行就是执行指令序列的过程。单片机运行就是执行指令序列的过程。编写这一指令序列的过程称为编写这一指令序列的过程称为程序设计。程序设计。汐碱晦敞国酶验久显谜顾熟衙侧洋舞泥睦镰蜕贾氢掏剥瓮吓绰卫滦左惹姑第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计44.1.1 4.1.1 单片机编程语言单片机编程语言常用的编程语言是常用的编程语言是汇编语言汇编语言和和高级语言高级语言。1 1

4、汇编语言汇编语言用英文字符来代替机器语言,这些英文字符被称为用英文字符来代替机器语言,这些英文字符被称为助记符汇助记符汇编语言:编语言:用助记符表示的指令。用助记符表示的指令。汇编语言源程序:汇编语言源程序:用汇编语言编写的程序。用汇编语言编写的程序。“汇编汇编”:汇编语言源程序需汇编语言源程序需转换(翻译)转换(翻译)成为二进制代码成为二进制代码表示的机器语言程序,才能识别和执行。表示的机器语言程序,才能识别和执行。完成完成“翻译翻译”的程序称为的程序称为汇编程序汇编程序。经汇编程序。经汇编程序“汇编汇编”得得到的以到的以“0”“0”、“1”“1”代码形式表示的机器语言程序称为代码形式表示的

5、机器语言程序称为目标目标程序程序。5穿薛疲吠凉几曼缘胡薯钝十锨恐棕抢宴缩斑帜八关詹镀盆游斧拖拎化哨渺第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计5优点:优点:用汇编语言编写程序效率高,占用存储空间小,运行用汇编语言编写程序效率高,占用存储空间小,运行速度快,能编写出最优化的程序,速度快,能编写出最优化的程序,缺点:缺点:可读性差,离不开具体的硬件,是面向可读性差,离不开具体的硬件,是面向“硬件硬件”的语言的语言通用性差。通用性差。2 2高级语言高级语言不受具体不受具体“硬件硬件”的限制,的限制,优点:优点:通用性强,直观、易懂、易通用性强,直观、易懂、易学,可读性好

6、。学,可读性好。目前多数的目前多数的51单片机用户单片机用户使用使用C语言(语言(C51)来进行程序设来进行程序设计,已公认为高级语言中高效简洁而又贴近计,已公认为高级语言中高效简洁而又贴近51单片机硬件的编单片机硬件的编程语言。程语言。将将C语言向单片机上移植,始于语言向单片机上移植,始于20世纪世纪80年代的中后期。年代的中后期。6庶楞虎缸缀袖咖纲湖胺酮存妆驴快团灼扎纤匆啪螟迹陈箩榆欠痴疫酞契凡第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计6经过十几年努力,经过十几年努力,C51C51已成为单片机的实用高级编程语言。已成为单片机的实用高级编程语言。尽管目前已有不少

7、设计人员使用尽管目前已有不少设计人员使用C51C51来进行程序开发,但在对来进行程序开发,但在对程序的程序的空间空间和和时间时间要求较高的场合,汇编语言仍必不可少。要求较高的场合,汇编语言仍必不可少。在这种场合下,可使用在这种场合下,可使用C C语言和汇编语言混合编程。在很多需语言和汇编语言混合编程。在很多需要直接控制硬件且对实时性要求较高的场合,则更是非用汇编要直接控制硬件且对实时性要求较高的场合,则更是非用汇编语言不可。语言不可。掌握汇编语言并能进行程序设计,是学习和掌握单片机程序掌握汇编语言并能进行程序设计,是学习和掌握单片机程序设计的设计的基本功之一基本功之一。4.1.2 4.1.2

8、汇编语言语句和格式汇编语言语句和格式两种基本语句:两种基本语句:指令语句指令语句和和伪指令语句伪指令语句。7徘忘豆徐酉糖炔咙唱毅垣湘铰倡廷周导旷滑赋要酮胚锗规八蔽蝗叁伸躲搀第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计7(1 1)指令语句)指令语句已在第已在第3 3章介绍。每一指令语句在汇编时都产生一个指令代码章介绍。每一指令语句在汇编时都产生一个指令代码(机器代码),执行该指令代码对应着机器的一种操作。(机器代码),执行该指令代码对应着机器的一种操作。(2 2)伪指令语句)伪指令语句是控制汇编(翻译)过程的一些是控制汇编(翻译)过程的一些控制命令控制命令。在汇编时。

9、在汇编时没有机器没有机器代码代码与之对应。与之对应。下面介绍指令语句格式。伪指令语句将在下面介绍指令语句格式。伪指令语句将在4.1.34.1.3节介绍。节介绍。花时这娇汽粒倔案熟藻螺姓菊颧菏尤穆亲喉宫驭派拭饰孩轨予绍韩衅郴铂第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计8汇编语言语句是符合典型的汇编语言的汇编语言语句是符合典型的汇编语言的四分段四分段格式格式:标号字段标号字段和和操作码字段操作码字段之间要有之间要有冒号冒号“:”分隔;分隔;操作码字段操作码字段和和操作数字段间操作数字段间的分界符是的分界符是空格空格;双操作数双操作数之间用之间用逗号逗号相隔;相隔;操作

10、数字段操作数字段和和注释字段注释字段之间的分界符用之间的分界符用分号分号“;”。任何语句都必须有操作码字段任何语句都必须有操作码字段,其余各段为任选项。,其余各段为任选项。9标号字段标号字段(LABLE)操作码字段操作码字段(OPCODE)操作数字段操作数字段(OPRAND)注释字段注释字段(COMMENT)脓豢嫌他赞秧锯膏狼摇把禽胞患闷悲彬仆扣鱼播排赏馋销胯靴尧萝硷古滦第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计9【例【例4-1】下面是一段程序的】下面是一段程序的四分段四分段书写格式。书写格式。标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段

11、注释字段START:MOVA,#00H;0AMOVR1,#10;10R1MOVR2,#00000011B;03HR2LOOP:ADDA,R2;(A)+(R2)ADJNZR1,LOOP;R1减减1不为零,则跳不为零,则跳LOOP处处NOPHERE:SJMPHERE上述上述4个字段应该遵守的个字段应该遵守的基本语法规则基本语法规则如下。如下。10舍蜗靛浑虐怔执坝阅迷赘件罢足讥锣扦矽陶惜授灌橱惫乳则喻拿鹃弥驮梦第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计101 1标号字段标号字段语句所在地址的标志符号,才能被访问。如标号语句所在地址的标志符号,才能被访问。如标号“STAR

12、T”“START”和和“LOOP”“LOOP”等。有关标号规定如下:等。有关标号规定如下:(1 1)标号后必须跟冒号标号后必须跟冒号“:”。(2 2)标号由标号由1 18 8个个ASCIIASCII码字符组成,第一个字符必须是码字符组成,第一个字符必须是字母。字母。(3 3)同一标号在一个程序中只能定义一次,不能重复定同一标号在一个程序中只能定义一次,不能重复定义。义。(4 4)不能使用汇编语言已经定义的符号作为标号,如指不能使用汇编语言已经定义的符号作为标号,如指令助记符、伪指令以及寄存器的符号名称等。令助记符、伪指令以及寄存器的符号名称等。(5 5)标号的有无,取决于本程序中的其他语句是否

13、访标号的有无,取决于本程序中的其他语句是否访11毯诀搂崖巧优鞭莹腻从地线排区泊将垫诸努性照核爆笺胰猖历精免喀悯慌第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计11问该条语句。如无其他语句访问,则该语句前不需标号。问该条语句。如无其他语句访问,则该语句前不需标号。2 2操作码字段操作码字段操作码字段规定了语句执行的操作,操作码是汇编语言指令中操作码字段规定了语句执行的操作,操作码是汇编语言指令中唯一不能空缺的部分。唯一不能空缺的部分。3 3操作数字段操作数字段指令的操作数或操作数地址。指令的操作数或操作数地址。在本字段中,在本字段中,操作数的个数因指令的不同而不同。操作

14、数的个数因指令的不同而不同。通常有单操通常有单操作数、双操作数和无操作数三种情况。作数、双操作数和无操作数三种情况。如果是多操作数,则操作数之间要以如果是多操作数,则操作数之间要以逗号逗号隔开。隔开。尝宁忌醉脐衅茨札迎细珐喷贴及纂陛着拒燕佛蹦躬崭鹏革柠庙政妈幻殿渝第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计12操作数表示操作数表示时,几种情况需注意:时,几种情况需注意:(1 1)十六进制、二进制和十进制形式的操作数表示)十六进制、二进制和十进制形式的操作数表示多数情况,操作数或操作数地址是采用多数情况,操作数或操作数地址是采用十六进制十六进制形式来表形式来表示的。则

15、需加示的。则需加后缀后缀“H”“H”。在某些特殊场合用在某些特殊场合用二进制二进制表示,需加表示,需加后缀后缀“B”“B”若操作数采用若操作数采用十进制十进制形式,则需加形式,则需加后缀后缀“D”“D”,也可省略。,也可省略。若十六进制若十六进制操作数操作数以以字符字符A AF F开头开头,需在它,需在它前面加一个前面加一个 “0” “0”,以便汇编时把它和,以便汇编时把它和字符字符A AF F区别区别开。开。13宠航栓牌灾侵伎汕豺草独瞬狂金丸播呼竞尧膘舆仇娟习昌棕艳归波灶歪拾第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计13(2 2)工作寄存器和特殊功能寄存器的表示

16、)工作寄存器和特殊功能寄存器的表示 当操作数为工作寄存器或特殊功能寄存器时,允许用当操作数为工作寄存器或特殊功能寄存器时,允许用工作寄存器和特殊功能寄存器的工作寄存器和特殊功能寄存器的代号表示代号表示。 例如,例如,工作寄存器用工作寄存器用R7R7R0R0,累加器用,累加器用A A(或(或AccAcc)表)表示。另外,工作寄存器和特殊功能寄存器也可用其地址来示。另外,工作寄存器和特殊功能寄存器也可用其地址来表示,如累加器表示,如累加器A A可用其地址可用其地址E0HE0H来表示。来表示。4 4注释字段注释字段用于解释指令或程序的含义,对可读性非常有用。用于解释指令或程序的含义,对可读性非常有用

17、。使用时使用时须以分号开头须以分号开头,长度不限,一行写不下,长度不限,一行写不下可换行可换行书写,但注意也要以分号开头。书写,但注意也要以分号开头。14脑忌致纽压蜗吼掩脖捂问纲守戈闯渤昨届妹蜂柳现渔亩航沃憎咖解文惰蛰第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计14 汇编时,遇到汇编时,遇到“;” ” 就停止就停止“翻译翻译”。因此,注释字。因此,注释字段不会产生机器代码。段不会产生机器代码。4.1.3 4.1.3 伪指令伪指令 在汇编语言源程序中应有在汇编语言源程序中应有向汇编程序发出的指示信息向汇编程序发出的指示信息,告诉它如何完成汇编工作,这是通过告诉它如何完

18、成汇编工作,这是通过伪指令伪指令来实现。来实现。 伪指令不属于指令系统中的汇编语言指令,它伪指令不属于指令系统中的汇编语言指令,它是程序员是程序员发给汇编程序的发给汇编程序的命令命令,也称为,也称为汇编程序控制命令汇编程序控制命令。 只有在汇编前的源程序中才有伪指令。只有在汇编前的源程序中才有伪指令。 “伪伪”体现在体现在汇编后,伪指令汇编后,伪指令没有相应的机器代码产生。没有相应的机器代码产生。 伪指令具有控制汇编程序的输入伪指令具有控制汇编程序的输入/ /输出、定义数据和符输出、定义数据和符号、条件汇编、分配存储空间等功能。号、条件汇编、分配存储空间等功能。15钢睦模滇抓硷受眺滁澎廖户藕玛

19、琼凄赚纠贡潭定邱仍楞醉急弓稿簧蟹屏嘲第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计15不同汇编语言的伪指令有所不同,但基本内容相同。不同汇编语言的伪指令有所不同,但基本内容相同。介绍介绍常用的伪指令常用的伪指令。1ORG(ORiGin)汇编起始地址命令)汇编起始地址命令源程序的开始,用一条源程序的开始,用一条ORG伪指令规定伪指令规定程序的起始地程序的起始地址址。如果不用如果不用ORG,则汇编得到的目标程序,则汇编得到的目标程序将从将从0000H地地址开始。例如:址开始。例如:ORG2000HSTART:MOVA,#00H即规定标号即规定标号START代表地址为代表地

20、址为2000H开始。开始。在一源程序中,可多次用在一源程序中,可多次用ORG指令,规定不同的程序段的指令,规定不同的程序段的起始地址。但是,起始地址。但是,地址必须由小到大排列,且不能交叉、地址必须由小到大排列,且不能交叉、蜜乙好缩航闪尤咙诣湘哪埋攒彪就暑灼尽腆鳞镀憎尿疡纂快坡诗丁溶剪碾第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计16重叠。例如:重叠。例如:ORG2000HORG2500HORG3000H这种顺序是正确的。若按下面顺序的排列则是错误的,因为地址出现了交叉。ORG2500HORG2000HORG3000H17身就彩糊桨偏乱茎胁杏绸痕胃砚弘蓟迎会拿显破闷

21、显瘦芍循除剃奇添戎逃第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计172. 2. END(END of Assembly)END(END of Assembly)汇编终止命令汇编终止命令源程序源程序结束标志结束标志,终止源程序的汇编工作。终止源程序的汇编工作。整个源程序整个源程序中只能有一条中只能有一条ENDEND命令,且命令,且位于程序的最后位于程序的最后。如果。如果ENDEND出现出现在程序中间,其后的源程序,将不进行汇编处理。在程序中间,其后的源程序,将不进行汇编处理。3 3EQUEQU(EQUateEQUate)标号赋值命令)标号赋值命令用于用于给标号赋值给标

22、号赋值。赋值后,标号值在整个程序有效。赋值后,标号值在整个程序有效。例如:例如:TESTTEST: EQU 2000HEQU 2000H表示表示TEST=2000HTEST=2000H,汇编时,凡是遇到,汇编时,凡是遇到TESTTEST时,均以时,均以2000H2000H来代替。来代替。18一估惯派抗邹狂训炔测职隔料甸漱正所叛季魁鼻皖阿棱韵干模氢忱早盆纹第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计184DB(DefineByte)定义数据字节命令)定义数据字节命令用于从指定的地址开始,在程序存储器连续单元中定义用于从指定的地址开始,在程序存储器连续单元中定义字节数据

23、。例如:字节数据。例如:ORG 2000HDB30H,40H,24,C,B汇编后汇编后(2000H)=30H(2001H)=40H(2002H)=18H(十进制数十进制数24)(2003H)=43H(字符字符“C”的的ASCII码码)(2004H)=42H(字符字符“B”的的ASCII码码)19件吧季踊惜试聊忧呈冶闲罗攫笼擂潞闪蘑胞控萨伤荆恒料嫂淤软怕蔡吁噎第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计19显然,显然,DB功能是从指定单元开始定义(存储)若干字节,功能是从指定单元开始定义(存储)若干字节,十进制数自然转换成十六进制数,字母按十进制数自然转换成十六进制数

24、,字母按ASCII码存储。码存储。5DW(DefineWord)定义数据字命令)定义数据字命令该命令用于从指定的地址开始,在程序存储器的连续单元中该命令用于从指定的地址开始,在程序存储器的连续单元中定义定义16位的数据字。例如:位的数据字。例如:ORG2000HDW1246H,7BH,10汇编后(2000H)=12H;第1个字(2001H)=46H(2002H)=00H;第2个字捅棱焙荡助疙宜型廊织建侗妹订理檀男娟扬淫私坝全担朱浙忆肋岸高触协第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计20(2003H)=7BH(2004H)=00H;第;第3个字个字(2005H)=

25、0AH6DS(DefineStorage)定义存储区命令)定义存储区命令从指定地址开始,保留指定数目的字节单元作为存储区,从指定地址开始,保留指定数目的字节单元作为存储区,供程序运行使用。供程序运行使用。例如:例如:TABEL:DS10表示从表示从TABEL代表的地址开始,保留代表的地址开始,保留10个连续的地址单个连续的地址单元。元。又例如又例如:ORG2000HDS10H表示从表示从2000H地址开始,保留地址开始,保留16个连续地址单元。个连续地址单元。21绕冤因拉埠岂摇涣清坯懊兢提棉喻题残邀幢炎逞臂辫忠插盈菌蹈斌静跨弓第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序

26、设计21注意:注意:DBDB、DWDW和和DSDS命令命令只能对程序存储器有效,只能对程序存储器有效,不能对不能对数据存储器数据存储器使用。使用。7 7BIT BIT 位定义命令位定义命令用于给字符名称赋以位地址,位地址可以是绝对位地用于给字符名称赋以位地址,位地址可以是绝对位地址,也可是符号地址。例如:址,也可是符号地址。例如:QAQABIT P1.6BIT P1.6功能是把功能是把P1.6P1.6的位地址赋给变量的位地址赋给变量QAQA。4.2 4.2 汇编语言源程序的汇编汇编语言源程序的汇编“汇编汇编”-”-可分为可分为手工汇编手工汇编和和机器汇编机器汇编两类。两类。22乞狭犊骨欲盐兼胞

27、望潜闭将抠斩修妨祸帛众炬猛浩摧栈移律锭尝裴终俊欠第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计224.2.1 4.2.1 手工汇编手工汇编 通过查指令的通过查指令的机器代码表(表机器代码表(表3-23-2),),逐个把助记符指令逐个把助记符指令“翻译翻译”成机器代码,再进行调试和运行。成机器代码,再进行调试和运行。 手工汇编手工汇编遇到相对转移偏移量的计算时,较麻烦,易出遇到相对转移偏移量的计算时,较麻烦,易出错,只有小程序或受条件限制时才使用。实际中,多采用错,只有小程序或受条件限制时才使用。实际中,多采用“汇汇编程序编程序”来自动完成汇编。来自动完成汇编。23挝盖

28、损撰邱酥圾租兽厩歌反啸然伸鞠英绍裂牵览鸭恳藤潭渝杀薄弧禽镐秒第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计234.2.2 4.2.2 机器汇编机器汇编 用微型计算机上的用微型计算机上的软件软件( (汇编程序汇编程序) )来代替手工汇编。在微来代替手工汇编。在微机上用编辑软件进行源程序编辑,然后生成一个机上用编辑软件进行源程序编辑,然后生成一个ASCIIASCII码文件,码文件,扩展名为扩展名为 “.ASM” “.ASM”。在微机上运行汇编程序,译成机器码。在微机上运行汇编程序,译成机器码。 机器码通过微机的串口(或并口)传送到用户样机(或在机器码通过微机的串口(或并口

29、)传送到用户样机(或在线仿真器),进行程序的调试和运行。线仿真器),进行程序的调试和运行。 有时,在分析某些产品的程序的机器代码时,有时,在分析某些产品的程序的机器代码时,需将需将机器代机器代码码翻译成翻译成汇编语言源程序汇编语言源程序,称为,称为“反汇编反汇编”。24牟嘶涣集部最挣屑舰魄攒雁周缴喳锈窑洗焉悸斟示繁才方即掸芋烬监膀躬第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计24【例【例4-2】表4-1是一段源程序的汇编结果,可查表3-2,手工汇编,来验证下面的汇编结果是否正确。机器码从1000H单元开始存放。25沤磅篡迈痰貌忠烹弃痕少齐鄂荫窜睛谜象栋赫讶螟氢皂卵触

30、熔馒偷偷钨熄第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计254.3 AT89S514.3 AT89S51汇编语言程序设计举例汇编语言程序设计举例 介绍常用的汇编语言程序的设计。介绍常用的汇编语言程序的设计。4.3.1 4.3.1 子程序的设计子程序的设计 将那些需多次应用的、完成相同的某种基本运算或操作将那些需多次应用的、完成相同的某种基本运算或操作的程序段从整个程序中独立出来,单独编成一个程序段,的程序段从整个程序中独立出来,单独编成一个程序段,需要时进行调用。这样的程序段称为需要时进行调用。这样的程序段称为子程序子程序。 优点:优点:采用子程序可使程序结构简单,

31、缩短程序的设计采用子程序可使程序结构简单,缩短程序的设计时间,减少占用的程序存储空间。时间,减少占用的程序存储空间。 子程序在程序设计中非常重要,读者应熟练掌握子程序子程序在程序设计中非常重要,读者应熟练掌握子程序的设计方法。的设计方法。26胰饲娃膳蒜味篡柑抓蕾慕馏瘩碟隶懈善舶靶察渝诀讯鞋昂广繁普阻俭尼州第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计261 1子程序的设计原则和应注意的问题子程序的设计原则和应注意的问题编写子程序应注意以下问题:编写子程序应注意以下问题: (1 1)子程序的入口地址,前必须有标号。)子程序的入口地址,前必须有标号。 (2 2)主程序调用

32、子程序,是通过调用指令来实现。有)主程序调用子程序,是通过调用指令来实现。有两条两条子程序调用指令子程序调用指令: 绝对调用指令绝对调用指令ACALL addr11ACALL addr11。双字节,。双字节,addr11addr11指出了指出了调用的目的地址,调用的目的地址,PCPC中中1616位地址中的高位地址中的高5 5位不变,被调用的位不变,被调用的子程序的首地址与绝对调用指令的下一条指令的高子程序的首地址与绝对调用指令的下一条指令的高5 5位地址位地址相同,即只能在同一个相同,即只能在同一个2KB2KB区内。区内。 长调用指令长调用指令LCALL addr16LCALL addr16。

33、三字节,三字节,addr16addr16为直接调为直接调用的目的地址,子程序可放在用的目的地址,子程序可放在64KB64KB程序存储器区任意位置。程序存储器区任意位置。27右倾疲峦字屉盅斌薄寨歇蔡研烦赋淮毋笨色讫需拓麻忍紊蜒挽央卢姚压魂第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计27(3 3)子程序结构中必须用到)子程序结构中必须用到堆栈堆栈,用来进行断点和现场的保,用来进行断点和现场的保护。护。(4 4)子程序返回主程序时,)子程序返回主程序时,最后一条指令必须是最后一条指令必须是RETRET指令指令,功能是把功能是把堆栈中的断点地址堆栈中的断点地址弹出送入弹出送

34、入PCPC指针中,从而实现子程指针中,从而实现子程序返回后从主程序断点处继续执行主程序。序返回后从主程序断点处继续执行主程序。(5 5)子程序可以)子程序可以嵌套嵌套,即主程序可以调用子程序,子程序又,即主程序可以调用子程序,子程序又可以调用另外的子程序。可以调用另外的子程序。28佳狈娩锅满渐咎哀藻灵鹃蔓曳已瓜嫡鸣圾兔爪扶察玛馈措东研涝拨痉义塌第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计282子程序的基本结构子程序的基本结构典型的子程序的基本结构如下:MAIN:;MAIN为主程序入口标号LCALLSUB;调用子程序SUB子程序SUB:PUSH PSW;现场保护PUS

35、H AccPOPAcc;现场恢复,注意要先进后出POPPSWRET;最后一条指令必须为RET29子程序处理程序段子程序子程序嘘粕法接兔扑剔末叙浪剑忘腻余足诽斧纵羹校论刻拯哑苹愧椒汝必运皋毗第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计29 注意:注意:上述子程序结构中,现场保护与现场恢复不是必需上述子程序结构中,现场保护与现场恢复不是必需的,要根据实际情况而定。的,要根据实际情况而定。4.3.2 4.3.2 查表程序设计查表程序设计 查表程序是一种常用程序查表程序是一种常用程序, ,避免避免复杂的运算或转换过程,复杂的运算或转换过程,可完成数据补偿、修正、计算、转换等

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

37、拇绍趁许衬活凸湾雷柞呼甸怕棋彭数指程范娃第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计30两条指令的功能完全相同,具体使用有差别。两条指令的功能完全相同,具体使用有差别。指令指令“MOVC AMOVC A,A+DPTRA+DPTR” 把把A A中内容与中内容与DPTRDPTR中的内容相加,中的内容相加,结果为某一程序存储单元的地址,然后把该地址单元的内容送结果为某一程序存储单元的地址,然后把该地址单元的内容送到到A A中。中。指令指令“MOVC AMOVC A,A+PCA+PC” ,PCPC的内容与的内容与A A的内容相加后所得的内容相加后所得的数作为某一程序存储器单

38、元的地址,根据地址取出程序存储的数作为某一程序存储器单元的地址,根据地址取出程序存储器相应单元中的内容送到累加器器相应单元中的内容送到累加器A A,指令执行后,指令执行后,PCPC的内容不发的内容不发生变化,仍指向该查表指令的下一条指令。生变化,仍指向该查表指令的下一条指令。优点:优点:在于预处理较少且不影响其他特殊功能寄存器的值,在于预处理较少且不影响其他特殊功能寄存器的值,不必保护其他特殊功能寄存器。不必保护其他特殊功能寄存器。31票珊状雄团肩覆腾豺冲烯缓探蚁坊挪牙咯候峡弃篆镊祥奶烤担姨用凄揪了第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计31缺点:缺点:在于该表

39、格只能存放在这条指令的地址在于该表格只能存放在这条指令的地址X3X2X1X0X3X2X1X0以下以下00H00HFFHFFH之中,即只能存放在地址范围之中,即只能存放在地址范围X3X2X1X0+1X3X2X1X0+1X3X2X1X0+100HX3X2X1X0+100H中,这就使得表格所在的程序空间受到了中,这就使得表格所在的程序空间受到了限制。限制。下面说明下面说明查表指令的用法查表指令的用法和和计算偏移量计算偏移量应注意的问题。应注意的问题。埂悸常勺啤拢槽悄弓地尧诫斥污沙演抿假嘘狰访厄耗瞧曙咙源旱恃浩骸置第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计32【例【例4-

40、3】设计一子程序,功能是根据累加器A中的数x(09之间)查x的平方表y,根据x的值查出相应的平方y。本例中的x和y均为单字节数。地地 址址 子程序子程序Y3Y2Y1Y0ADDA,#01HY3Y2Y1Y0+2MOVCA,A+PCY3Y2Y1Y0+3RETY3Y2Y1Y0+4DB00H,01H,04H,09H,10HDB19H,24H,31H,40H,51H;数09的平方表33循则陷敬抽恶抄坞浓帚佣表蛮肤吉址迷寄蚌罪幢姑摇捐辱痘芥期唱狂廖育第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计33指令指令“ADD A“ADD A,#01H”#01H”的作用的作用是是A A中的内容

41、加上中的内容加上 “01H”“01H”, “01H” “01H”即为查表指令与平方表之间的即为查表指令与平方表之间的“RET”“RET”指令所占的字节数。加上指令所占的字节数。加上 “01H” “01H”后,可保证后,可保证PCPC指向表首,指向表首,累加器累加器A A中原来的内容仅是从表首开始向下查找多少个单中原来的内容仅是从表首开始向下查找多少个单元。元。在进入程序前,在进入程序前,A A的内容在的内容在000009H09H之间,如之间,如A A中的内容中的内容为为02H02H,它的平方为,它的平方为04H04H,可根据,可根据A A的内容查出的内容查出x x的平方的平方指令指令“MOVC

42、 A“MOVC A,A+DPTR”A+DPTR” 应用范围较广,使用该指应用范围较广,使用该指令时不必计算偏移量,优点是表格可以设在令时不必计算偏移量,优点是表格可以设在64KB64KB程序存储程序存储器空间内的任何地方,而不像器空间内的任何地方,而不像“MOVC A“MOVC A,A+PC”A+PC”那样只那样只设在设在PCPC下面的下面的256256个单元中,所以使用较方便。个单元中,所以使用较方便。34续驹雅馅敞蠕总痔粕辉粥予邹祸沫鳞焊器暑沾钟泛叼惹跌唬妨杯必飘大雏第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计34如果DPTR已被使用,则在查表前必须保护DPTR

43、,且结束后恢复DPTR,例4-3可改成如下形式:PUSHDPH;保存DPHPUSHDPL;保存DPLMOVDPTR,#TAB1MOVC A,A+DPTRPOPDPL;恢复DPLPOPDPH;恢复DPHRETTAB1: DB00H,01H,04H,09H,10H;平方表DB19H,24H,31H,40H,51H实际查表,有时x为单字节数,y为双字节数。来看下例。35升羚搐墟猫侨蜜犬搀呜亚柳干姚弘椽恋券框猾丛努乌扇稚捕葱炊蒲裴惰免第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计35【例【例4-4】有一巡回检测报警装置,需对16路(x)输入进行检测,每路有一个最大允许值(y)

44、,为双字节数。需根据测量的路数(x),查表找出对应该路的最大允许值(y),看输入值是否大于最大允许值,如果大于就报警。取路数为x(0x15),y为最大允许值,放在表格中。设进入查表程序前,假设路数x已放于R2中,查表后该路的最大允许值y放于R3R4中。查表的程序如下:36治趾姿痛寝媒咏顿纤愁腕佐撑求节章诧都擅料笋商邦礁诀愉兽蜘膜汾域狱第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计36TB3:MOVA,R2ADDA,R2;(R2)*2(A)MOVR3,A;保存指针ADDA,#6;加偏移量MOVCA,A+PC;查第一字节XCH A,R3ADD A,#3MOVCA,A+PC

45、;查第二字节MOVR4,ARETTAB3: DW1520,3721,42645,7580;最大值表DW3483,32657,883,9943DW10000,40511,6758,8931DW4468,5871,13284,2780837态攻厄稚柏凋寡曰绷那谭似咬馅讽阮纵熙墙诚滞拴莫引歹埔酵禾琉珐陈勾第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计37表格长度不能超过表格长度不能超过256B256B,且表格只能存放于,且表格只能存放于“MOVC AMOVC A,A+PCA+PC”指令以下的指令以下的256256个单元中,如需把表格放在程序存储个单元中,如需把表格放在程序存

46、储器空间的任何地方,应使用指令器空间的任何地方,应使用指令“ MOVC A MOVC A,A+DPTRA+DPTR”。【例【例4-54-5】 以以AT89S51AT89S51为核心的温度控制器,温度传感器为核心的温度控制器,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由输出的电压与温度为非线性关系,传感器输出的电压已由A/DA/D转换为转换为1010位二进制数。测得的不同温度下的电压值数据位二进制数。测得的不同温度下的电压值数据构成一个表,表中温度值为构成一个表,表中温度值为y y(双字节无符号数),(双字节无符号数),x x(双字(双字节无符号数)为电压值数据。设测得电压值节无

47、符号数)为电压值数据。设测得电压值x x放入放入R2R3R2R3中,中,根据根据电压值电压值x x,查找对应的,查找对应的温度值温度值y y,仍放入,仍放入R2R3R2R3中。参考程中。参考程序:序:38挚诱停随海练咆娱鸽眉憨醚澜伶叠蕾刮闯讣供奉壕阿择智踊寅烛涯邓汽裙第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计38LTB2:MOVDPTR,#TAB2MOVA,R3CLRCRLCAMOVR3,AXCHA,R2RLCAXCHR2,AADDA,DPL;(R2R3)+(DPTR)(DPTR)MOVDPL,AMOVA,DPHADDCA,R2MOVDPH,ACLRA39瑞唉箩器

48、破橙携们控箱船秃鸥绢峨姆涪吮醉亢邀吞乙册渝昌肤敌存牡芥舞第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计39MOVCA,A+DPTR;查第一字节MOVR2,A;第一字节存入R2中CLRAINCDPTRMOVCA,A+DPTR;查第二字节MOVR3,A;第二字节存入R3中RETTAB2: DW,;温度值表由于使用了指令“MOVCA,A+DPTR”,表TAB2可放入64KB程序存储器空间任何位置,表格的长度可大于256B。40玉胳戮姥秆影亢馈高丈逃部映哺桨摘更恰几缸颊芜包答窖斑锌绷畜怨函筏第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计404.3.3

49、关键字查找程序设计关键字查找程序设计在表中查找关键字的操作,也称为数据检索。有两种方法,即顺序检索和对分检索。1顺序检索顺序检索要检索的表是无序无序的,检索时只能从第只能从第1项开始逐项查项开始逐项查找找,判断所取数据是否与关键字相等。【例【例4-6】从50个字节的无序表中查找一个关键字“xxH”。ORG1000HMOV30H,#xxH;关键字xxH送30H单元MOVR1,#50;查找次数送R1MOVA,#14H;修正值送AMOVDPTR,#TAB4 ;表首地址送DPTR41顷秩似塌谅窗闻荐车皂豆惑斩甘晋及垮扯扳跌薛杆蛤乔啤筏孤涌茅锰犯认第4章AT89S51汇编语言程序设计第4章AT89S51

50、汇编语言程序设计41LOOP: 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个无序数据表42冰悉绩云昌砖别师孰铱霞闸谚枉羔拓铃篮吃聪搓指倦惠辽衅拷嚏伴吩浸放第4

51、章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计422对分检索对分检索对分检索的前提是检索的数据表已经排好序已经排好序,以便于按照对分原则取数。如何进行数据排序,稍后介绍。对分检索的方法对分检索的方法:取数据表中间位置的数与关键字进行比较,如相等,则查找结束。如果取数大于关键字取数大于关键字,则下次对分检索的范围是从数据区起点到本次取数处。如果取数小于关键字取数小于关键字,则下次对分检索的范围是从本次取数数据区起点到数据区终点。依此类推,逐渐缩小检索范围,减少次数,大大提高查找速度。43浩示僚转四羹结丧茅瞄永腑稗航秸东亲坐蝶袱零烃充揽诞卜娜镊芬奸掂维第4章AT89S51汇编

52、语言程序设计第4章AT89S51汇编语言程序设计434.3.4数据极值查找程序设计数据极值查找程序设计进行数值大小的比较,从一批数据中找出最大最大值(或最小值最小值)并存于某一单元中。【例【例4-7】片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存放首地址,R2中存放字节数,程序框图见图4-1。程序如下:MOV R2,n;n为要比较的数据字节数MOV A,R0;存首地址指针MOV R1,ADEC R2MOV A,R1奉懦键剖赋老彝陪趁蛛务袒醛占挠拾离松移赤湖武祥静籽货卑瓤捶嵌被赃第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计44LOOP: MOV R

53、3,ADEC R1CLR CSUBBA,R1;两个数比较JNCLOOP1;C=0,A中数大,跳LOOP1MOVA,R1;C=1,则大数送ASJMPLOOP2LOOP1:MOV A,R3LOOP2:DJNZ R2,LOOP;是否比较结束?MOV R0,A;存最大数RET45斧犁诉匝铀奖鹊奔锅洞明缺波腺适澡肇宵监商乖茎忱键芒懦恼山亩粟揖疑第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计454.3.5数据排序程序设计数据排序程序设计将一批数由小到大(升序升序)排列,或由大到小(降序降序)排列。最常用的数据排序算法是冒泡法冒泡法,是相邻数互换的排序方法,因其过程类似水中气泡上浮

54、,故称冒泡法。排序时,从前向后进行相邻两个数的比较从前向后进行相邻两个数的比较,如果数据的大数据的大小次序小次序与要求的顺序不符时要求的顺序不符时,就将两个数互换两个数互换;否则,顺序符合要求就不互换。如果进行升序排序,应通过这种相邻数互换方法,使小数向前移,大数向后移。如此从前向后进行一次次相邻数互换(冒泡),(冒泡),就会把这批数据的最大数排到最后,次大数排在倒数第二的位置,46胖耿璃种笺柞普虫晤窜糟号滞锚注泅锁难郴徘颤屿轻矽爹靴贩棚拣阐球腔第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计46从而实现一批数据由小到大的排列。假设有7个原始数据的排列顺序为6、4、1、

55、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;逆序,互换,第一次冒泡结束47处痕仓晌汇蛆兴泻逃芝吩褪窟父缸胁口搜垃又悸瓮守榜标功砸粗斤古九恒第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计47如此进行,各次冒泡的结果如下:如此进行,各次冒泡的结果如下:第第1次冒泡结果:次冒泡结果:4、1、2、5、6、3、7第第2次冒泡结果

56、:次冒泡结果: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)次)次就已完成排序。就已完成排序。48优糯渭邑善皖细享陕甘借获墨纷韵个偿呛表崇赞姥匣烯睬汀额凯瘁宿椿睡第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计4

57、8例如,上面的例如,上面的7个数个数,应进行,应进行6次次冒泡冒泡,但,但实际上实际上第第4次次冒泡时冒泡时就已经完成就已经完成排序。排序。如何判定排序是否已经完成如何判定排序是否已经完成?就是看各次冒泡中?就是看各次冒泡中是否有是否有互换互换发发生生,如果有,则排序,如果有,则排序还没完成还没完成;否则就表示已经排好序。;否则就表示已经排好序。在程序设计中,常用在程序设计中,常用设置互换标志设置互换标志的方法,用标志的状态表示的方法,用标志的状态表示是否有互换进行。是否有互换进行。【例【例4-8】一批单字节无符号数,以一批单字节无符号数,以R0为首地址指针,为首地址指针,R2中为中为字节数,

58、将这批数进行升序排列。程序框图如字节数,将这批数进行升序排列。程序框图如图图4-2所示。程所示。程序如下:序如下:鸥厂溪毅患盆楚蔑顽键硅蹈访稼像绳搏吩嘶矿素如绅公丸媒柱陵达由戏陨第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计49SORT: MOVA,R0MOVR1,AMOVA,R2;字节数送入R5MOVR5,ACLR F0;互换标志位F0清0DEC R5MOVA,R1LOOP: MOVR3,AINCR1CLR CMOVA,R1;比较大小50凤湾市物和尼介扯缉盼未凸适读慈绍止晋纽涝甚外尖侠韧舰纬奎惩捕饺宛第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程

59、序设计50SUBBA,R3JNCLOOP1SETBF0;互换标志位F0置1MOVA,R3;XCH A,R1;两个数互换DECR1XCH A,R1INCR1LOOP1:MOVA,R1DJNZR5,LOOPJBF0,SORTRET51阳泰连斯它疡氓贮深洼耻予衣咬安傅敷胰帚游熄疥居盲末切栓纬胞俯痕何第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计5152图4-24-2 单字节无符号数排序程序框图诬粟吩谤崭摇华揽翌砌肉农催馈渺赴叙颁音饮耻巧哥增契故擦咬簇醚叠卢第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计524.3.6分支转移程序设计分支转移程序设计分

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

61、此,应首先判。因此,应首先判被转换数的符号,负数进行转换,正数本身即为补码。被转换数的符号,负数进行转换,正数本身即为补码。53扁匪翅曼仲妖穿衣涡磷顷赐柱群苛雪匪酪扑畜凉绿孽铡坍诬企聘卿卯膊芹第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计53设二进制数放在A中,其补码放回到A中,框图如图图4-3所所示示。参考程序如下:CMPT:JNBAcc.7,RETURN ;(A)0,不需转换MOV C,Acc.7;符号位保存CPLA;(A)求反,加1ADD A,#1MOVAcc.7,C;符号位存在A的最高位RETURN:RET54捂朽肆辖酥稻驾支鬃聘浅偶盈诊粥泄笋碎澈寄剿铸投争吻

62、堤煽敝感我历健第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计54图4-34-3 求求单字字节有符号二有符号二进制数制数补码的框的框图视她轩凳旧惠的壤荡窑究碍似榴葵乘瞬唱蹈检去沼赎涉冈蛔掘怖恼磺募迸第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计55此外,单分支选择结构还有图图4-4、图图4-5所示的几种形式。56图4-4 单分支选择结构2 图4-5 单分支选择结构3误伤植揍槐援乖七羹仓怕攘鞋谱秒峙殆柜俏自寥端栗竭肢记娱缕航娠善瓜第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计562多分支选择结构多分支选择结构当程序的判别

63、部分有两个以上两个以上的出口出口时,为多分支选择结构。有两种形式,如图4-6和图图4-7所示。57 图4-64-6 多分支选择结构1 1 图4-74-7 多分支选择结构2敢敖尖虫跋但繁憎硝膳弥穆嘛羌旬郑粪辊樱竟弊颗擅俯句卞物败斑盐畴域第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计57指令系统提供了非常有用的指令系统提供了非常有用的两种多分支选择指令两种多分支选择指令:间接转移指令间接转移指令JMPA+DPTR比较转移指令比较转移指令CJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNERi,#data,rel间接转移指令

64、间接转移指令“JMPA+DPTR”由数据指针由数据指针DPTR决决定多定多分支转移分支转移程序的程序的首地址首地址,由,由A的内容选择对应分支。的内容选择对应分支。4条条比较转移指令比较转移指令CJNE能对两个欲比较的单元内容进能对两个欲比较的单元内容进行比较,当行比较,当不相等不相等时,程序实现相对转移;若时,程序实现相对转移;若两者相等两者相等,则顺序往下执行。则顺序往下执行。58奴韵裕遍拍觉帆酞妊袁车好授哟夫斗艘蜒洛读驶放芦脉斟易议慰言呀碉凄第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计58简单的分支转移程序的设计,常采用逐次比较法逐次比较法,就是把所有不同的情

65、况一个一个地进行比较,发现符合就转向对应的处理程序。缺点是程序太长,有n种可能的情况,就需有n个判断和转移。【例4-10】求符号函数的值。符号函数定义如下:X存放在40H单元,Y存放在41H单元,如图4-6所示。59Y=1X 0X 0X= 00-1腑皋捍婶街马彬釉饵和白决窝述玉凤萄防屿涉昌菇贱键始侗仟受尉早沛滋第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计59程序如下:程序如下:SIGNFUC:MOV A,40HCJNEA,#00H,NZEARAJMP NEGTNZEAR:JBAcc.7,POSIMOV A,#01HAJMPNEGTPOSI:MOVA,#81HNEGT

66、:MOV41H,AEND60聚葱苏柿揭竣溅请糕嘿蹋黑言谱怎咐足这央哗身靴宿汇酞棚闷狭鞠十专辽第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计60实际中,经常遇到图4-7的分支转移程序设计,典型例子典型例子就是当单片机系统中的键盘按下时,就会得到一个键值,根据不同的键值,跳向不同的键处理程序入口。此时,可用直接转移指令(LJMP或AJMP指令)组成一个转移表,然后把该单元的内容读入累加器A,转移表首地址放入DPTR中,再利用间接转移指令实现分支转移。【例【例4-11】根据寄存器R2的内容,转向各个处理程序PRGX(X=0n)。(R2)=0,转PRG0(R2)=1,转PRG

67、1(R2)=n,转PRGn61姬柏掉丈腊瞩洞圆跪异灸奄肿铰诞丛厩蛙摄秋丢揽吏动峭荧管铲溉仍曝己第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计61程序如下:JMP6:MOVDPTR,#TAB5;转移表首地址送DPTRMOV A,R2;分支转移参量送AMOV B,#03H;乘数3送BMULAB;分支转移参量乘3MOV R6,A;乘积的低8位暂存R6MOV A,B;乘积的高8位送AADDA,DPH;乘积的高8位加到DPH中MOV DPH,AMOV A,R6JMPA+DPTR;多分支转移选择62踩盆禄庞虎珊忠定辣无哈兼诫赖常徽席骸厩私彰写阻邹乖的休唉措类铱凉第4章AT89S5

68、1汇编语言程序设计第4章AT89S51汇编语言程序设计62TAB5: LJMP PRG0;多分支转移表LJMP PRG1LJMP PRGnR2中的分支转移参量乘3是由于长跳转指令LJMP要占3个单元。本例程序可位于64KB程序存储器空间的任何区域。4.3.7循环程序设计循环程序设计程序中含有可以反复执行的程序段,称循环体循环体。例如,求100个数的累加和,没必要连续安排100条加法指令,用一条加法指令使其循环执行100次。因此可缩短程序长缩短程序长度度和程序所占的内存单元数量更少占的内存单元数量更少,使程序结构紧凑程序结构紧凑。63桐码罕烃猛腆东驮袖衷遇童荡灾阿临哉悯匠哩旬勇援誉彬耶觉撅揪圣寒

69、资第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计631循环程序的结构循环程序的结构主要由以下四部分组成。(1)循环初始化)循环初始化完成循环前的准备工作。例如,循环控制计数初值的设置、地址指针的起始地址的设置、为变量预置初值等。(2)循环处理)循环处理完成实际的处理工作,反复循环执行的部分,故又称循环体。(3)循环控制)循环控制在重复执行循环体的过程中,不断修改循环控制变量,直到符合结束条件,就结束循环程序的执行。64爆仲绅岗货嚏澳过荐怒痘耿份泞拍锈度检坊境晒宜粉悬赤吐锐艰淫俐淮出第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计64循环结束控制

70、方法分为循环计数控制法和条件控制法。(4)循环结束)循环结束这部分是对循环程序执行的结果进行分析、处理和存放。2循环结构的控制循环结构的控制分为循环计数控制结构循环计数控制结构和条件控制结构条件控制结构。图4-8是计数循环控制结构,图4-9是条件控制结构。65尝秦踩悉评敏离炎炎择伤臣丛崭用邮氟景岸舆逾泻救建达朵坏狠战醚迷恫第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计6566图4-8计数循环控制结构图4-9条件控制结构隶烫吝瀑斯助伸蔗葛丹副耳啼瑰湍独袍丫腆墒恢保航碍眷嫁阔追予武令医第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计66(1)计数循

71、环控制结构)计数循环控制结构依据计数器的值来决定循环次数,一般为减1计数器,计数器减到“0”时,结束循环。计数器初值在初始化设定。MCS51指令系统提供了功能极强的循环控制指令:DJNZRn,rel;以工作寄存器作控制计数器DJNZdirect,rel;以直接寻址单元作控制计数器例如例如,计算n个数据的和,计算公式为。如直接按公式编写程序,则n=100时,需编写连续的100次加法。这样程序将太长,并且n可变时,将无法编写出程序。67耻愧众掷糕屋诞唐酞均逞丈韶龙戴八替折誉剁邀零纠寸裁袄瞒钢她灸发够第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计67公式要改写为用程序实现的

72、形式,用下式表示程序框图见图4-10。68图图4-104-10 求数据和的程序框图求数据和的程序框图私掌辅匿遮传卜簿箩早脏诅穆睁呻祈桶哎厘劈医礼蝎乃豫孕次尽籍荫地钞第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计68【例【例4-12】求n个单字节无符号数xi的和,xi按i顺序存放在AT89S51单片机内部RAM从50H开始的单元中,n放在R2中,和(双字节)放在R3R4中。程序如下:ADD1:MOVR2,#n ;加法次数n送R2MOVR3,#0 ;R3存放和的高8位,初始值为0MOVR4,#0 ;R4存放和的低8位,初始值为0MOVR0,#50HLOOP: MOVA,R

73、4ADD A,R0MOVR4,AINCR0CLR A69奔况涪枣跌于含着彝白姚谈稀凸裔谢腹行唾辊当颈辱统短班切糊乾创惠犹第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计69ADDCA,R3MOVR3,ADJNZR2,LOOP;判加法循环次数是否已到?END用寄存器R2作为计数控制变量,R0作为变址单元,用它来寻址xi。一般来说,循环工作部分中的数据应该用间接方式来寻址,如这里用:ADDA,R0计数控制计数控制只有在循环次数已知循环次数已知的情况下才适用。循环次循环次数未知数未知,不能用循环次数来控制,往往需要根据某种条件需要根据某种条件来判断是否应该终止循环。70促愧嘉

74、斯公菱桃嗓河磁水蒜钻在茫认霍病句余湘镣仓户搂甄畔消遭毕僻未第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计70(2)条件控制结构)条件控制结构结构见图4-9。循环控制中,设置一个条件,判是否满足该条件,如满足,则循环结束。如不满足该条件则循环继续。【例【例4-13】一串字符,依次存放在内部RAM从30H单元开始的连续单元中,字符串以0AH为结束标志,测试字符串长度字符串长度。采用逐个字符依次与“0AH”比较(设置的条件)的方法。设置一个累计字符串长度的长度计数器和一个用于指定字符串指针。如果字符与“0AH”不等不等,则长度计数器和字符串指针都加1;如果比较相等相等,则表

75、示该字符为“0AH”,字符串结束字符串结束,计数器值就是字符串的长度。程序如下:71您理螺苏适腮痰扇硼登绸蛛椽侈伺翠值脂锻阮磕唱羽贯糙帚章崔棕嗣疲液第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计71MOVR4,#0FFH;长度计数器初值送R4MOVR1,#2FH;字符串指针初值送R1NEXT:INC R4INC R1CJNER1,#0AH,NEXT;比较,不等则进行下一;字符比较END上面两例都是在一个循环程序中不再包含其他循环程序,则称该循环程序为单循环程序。如果一个循环程序中包含了其他循环程序,则称为多重循环程序。最常见的多重循环是由DJNZ指令构成的软件延时程序

76、,是常用程序之一。72锦窒剐害咕颁务怨仪迁疗馅晨涤戏好念牺隅林爵论狡赢淌寞岭养戳亏句弧第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计72【例【例4-14】50ms延时程序。软件延时程序与指令执行时间有很大的关系。在使用12MHz晶振时,一个机器周期为1s,执行一条DJNZ指令的时间为2s。可用双重循环方法双重循环方法的延时50ms程序:DEL:MOVR7,#200;本指令执行时间1sDEL1:MOVR6,#125;本指令执行时间1sDEL2:DJNZR6,DEL2;指令执行1次为2s,计;1252s=250s DJNZR7,DEL1;指令执行时间2s,本循环体;执行1

77、25次RET;指令执行时间2s73陛根橱开郑驮瞻烩窿蚜同斟嘴右疽奋忍轻氟搽睬非布柞斥门御瑚涛侄别紊第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计73以上延时程序不是太精确不是太精确,如把所有指令的执行时间计算在内,它的延时时间为1+(1+250+2)200+2s=50.603ms,如要求比较精确的延时,应对上述程序进行修改,才能达到较为精确的延时时间。但要注意,用软件实现延时程序,不允许有中断,否则将严重影响定时的准确性。对于延时更长的时间,可采用多重的循环,如1s延时,可用三重循环。74雪仗亲梦栅豢找殊银罗膘瓦愤揍纂未淑躯揭鞠浮埋戍妆泄开开浚净瑚汝锚第4章AT89S51汇编语言程序设计第4章AT89S51汇编语言程序设计74

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

最新文档


当前位置:首页 > 办公文档 > 工作计划

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