第5章MCS51汇编语言程序设计_第1页
第5章MCS51汇编语言程序设计_第2页
第5章MCS51汇编语言程序设计_第3页
第5章MCS51汇编语言程序设计_第4页
第5章MCS51汇编语言程序设计_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、p5.1 5.1 汇编语言源程序的格式汇编语言源程序的格式 p5.25.2 伪指令伪指令 p5.3 5.3 汇编语言源程序的人工汇编汇编语言源程序的人工汇编p5.4 MCS-515.4 MCS-51汇编语言程序的基本结构汇编语言程序的基本结构与设计举例与设计举例1u计算机能够计算机能够直接直接执行的是:执行的是:0 0和和1 1组成的组成的机器码指令程序。机器码指令程序。2u上一章在讲解指令时的程序,其特点是:上一章在讲解指令时的程序,其特点是:1、指令是采用助记符,而不是用机器码表示;指令是采用助记符,而不是用机器码表示;2、地址是采用标号地址地址是采用标号地址(符号地址符号地址),而不是真

2、正的实际,而不是真正的实际地址。地址。u汇编语言源程序:用助记符和标号地址编写的程序。汇编语言源程序:用助记符和标号地址编写的程序。u汇编语言面向机器,要经过汇编。汇编语言面向机器,要经过汇编。u高级语言高级语言面向算法、过程、对象,类似自然语言,可移植面向算法、过程、对象,类似自然语言,可移植性好,须经解释或翻译后才能被执行。性好,须经解释或翻译后才能被执行。3汇编汇编p汇编:汇编:将汇编语言源程序转换成机器语言目标程序的过将汇编语言源程序转换成机器语言目标程序的过程称为汇编。程称为汇编。(可人工汇编可人工汇编或或机器汇编机器汇编)p 汇编程序:汇编程序:能将汇编语言源程序转换成机器语言目标

3、程能将汇编语言源程序转换成机器语言目标程序的序的软件软件称为汇编程序。称为汇编程序。(机器汇编机器汇编)pMCS-51MCS-51的汇编语言的的汇编语言的四分段格式四分段格式如下:如下:4 标号:标号: 操作码操作码 操作数;注释操作数;注释 规则:规则:(1 1)标号字段和操作字码段之间要有冒号标号字段和操作字码段之间要有冒号“:”相隔;相隔;(2 2)操作码字段和操作数字段间的分界符是空格;)操作码字段和操作数字段间的分界符是空格;(3 3)多操作数之间用逗号相隔;多操作数之间用逗号相隔; (4 4)操作数字段和注释字段之间的分界符用分号)操作数字段和注释字段之间的分界符用分号“;”相相隔

4、。隔。 操作码字段为必选项,其余各段为任选项。操作码字段为必选项,其余各段为任选项。例如:例如: START: MOV A,#00H ;0A NOPNOP51标号标号 是语句所在地址的标志符号。是语句所在地址的标志符号。命名规范如下:命名规范如下:(1)由)由18个字母、数字与下划线个字母、数字与下划线“-”组成;组成;(2)首字符为字母;)首字符为字母;(3)同一标号在一个程序中只能定义一次;)同一标号在一个程序中只能定义一次; (4)绝对不允许把指令的保留字、寄存器及伪指令字符)绝对不允许把指令的保留字、寄存器及伪指令字符作为语句的标号。作为语句的标号。2操作码字段操作码字段 是汇编语言指

5、令中唯一不能空缺的部分。汇编程序就是是汇编语言指令中唯一不能空缺的部分。汇编程序就是根据这一字段来生成机器代码的。根据这一字段来生成机器代码的。 操作码段也可以是伪指令的助记符,在汇编时起作用。操作码段也可以是伪指令的助记符,在汇编时起作用。63操作数操作数: 表示指令操作的对象,可以是一个具体的表示指令操作的对象,可以是一个具体的数据,也可以是参加运算的数据所在的地址。操作数数据,也可以是参加运算的数据所在的地址。操作数一般有以下几种形式:一般有以下几种形式: 没有操作数没有操作数:操作数隐含在操作码中,如:操作数隐含在操作码中,如RETRET指令。指令。 只有一个操作数只有一个操作数,如,

6、如INC AINC A指令。指令。 有两个操作数有两个操作数:如:如MOV AMOV A,30H30H指令,操作数之间以逗号指令,操作数之间以逗号相隔。相隔。 有三个操作数有三个操作数:如:如CJNE ACJNE A,#00H#00H,LOOPLOOP指令。指令。 可以采用字母或数字等多种表示形式。可以采用字母或数字等多种表示形式。7操作数是立即数操作数是立即数, ,可用二进制、十进制和十六进制形式:可用二进制、十进制和十六进制形式:十六进制,后缀十六进制,后缀“H” H” 。 二进制,后缀二进制,后缀“B” B” 。十进制,后缀十进制,后缀“D”D”,也可省略。,也可省略。 若十六进制的若十

7、六进制的操作数以字符操作数以字符AFAF中的某个开头时,中的某个开头时,则需在它则需在它前面加一个前面加一个 “ “0”0”,以便在汇编时把它和字符,以便在汇编时把它和字符AFAF区别开来。区别开来。 注意数字前加注意数字前加“#”#”。 带加、减运算符的表达式带加、减运算符的表达式: :8对于直接地址对于直接地址directdirect,有多种选择:,有多种选择: (1)(1)直接数据地址(各种进制),如直接数据地址(各种进制),如MOV AMOV A、30H30H等;等; (2)(2)标号地址,如标号地址,如MOV AMOV A,SUMSUM等,等, SUMSUM应该在程序中应该在程序中某

8、处加以定义;某处加以定义; (3)(3)带有加减的表达式,设带有加减的表达式,设SUMSUM为已定义的标号地址,为已定义的标号地址, 如如MOV AMOV A,SUM+13SUM+13; (4)(4)特殊功能寄存器名,如特殊功能寄存器名,如MOV AMOV A,P2P2等。等。9美元符号美元符号$的使用的使用用于表示该转移指令操作码所在的地址。用于表示该转移指令操作码所在的地址。例如,如下例如,如下指令:指令: JNB F0, $与如下指令是等价的:与如下指令是等价的:HERE:JNB F0,HERE 注释指令或程序的含义,便于阅读程序、注释指令或程序的含义,便于阅读程序、维护程序。维护程序。

9、 必须用必须用“;”隔开,隔开,续行续行时,也必须以时,也必须以“;”开头开头 。10 只有在汇编前的源程序中才有伪指令。经过汇编只有在汇编前的源程序中才有伪指令。经过汇编得到目标程序(机器代码)后,伪指令已无存在的必得到目标程序(机器代码)后,伪指令已无存在的必要,所以要,所以“伪伪”体现在汇编时,体现在汇编时,伪指令没有相应的机伪指令没有相应的机器代码产生器代码产生。 伪指令伪指令是告诉汇编程序,是告诉汇编程序,如何汇编如何汇编源程序的指令。源程序的指令。不属于指令系统中的指令不属于指令系统中的指令。 用来对汇编过程进行某种控制,或者对符号、标号用来对汇编过程进行某种控制,或者对符号、标号

10、赋值。赋值。 不同版本不同版本的汇编语言,基本用法类似,但的汇编语言,基本用法类似,但稍有不同稍有不同。11(1)起始地址伪指令起始地址伪指令用于用于设定设定目标程序段目标程序段或或数据块数据块的的起始地址起始地址。注意:注意:地址从小到大,且不能重叠。地址从小到大,且不能重叠。它放在一段源程序(主程序、它放在一段源程序(主程序、子程序)或数据块的前面,说明紧跟在其后的程序段或数子程序)或数据块的前面,说明紧跟在其后的程序段或数据块的起始地址就是伪指令中的据块的起始地址就是伪指令中的16位绝对地址或用标号、位绝对地址或用标号、表达式表示的地址。一般默认从表达式表示的地址。一般默认从0000开始

11、。开始。 p例如:例如: ORG 2000HSTART: MOV A, #7FHp它表明标号为它表明标号为START的目标程序是从的目标程序是从2000H单元开始存单元开始存放的。放的。 12(2)定义字节伪指令)定义字节伪指令 DB用于从指定的地址开始,在用于从指定的地址开始,在程序存储器程序存储器的连续单元中定的连续单元中定义字节数据。义字节数据。8位数表可以是一字节常数或字符,或用逗号位数表可以是一字节常数或字符,或用逗号分开的分开的字节串字节串,或用引号括起来的字符串。,或用引号括起来的字符串。例如例如: ORG 2000H TAB1: DB 30H, 8AH, 7FH, 73 DB

12、“5”, “a”, BCD30H2008H8AH2007H7FH2006H49H2005H35H2004H61H2003H42H2002H43H2001H44H2000H由于由于ORG 2000H,所以,所以TAB1的地址为的地址为2000H,因此以上伪指令经汇编以后,将对,因此以上伪指令经汇编以后,将对2000H开始的若干内存单元赋值。开始的若干内存单元赋值。13(3)定义数据字伪指令)定义数据字伪指令 DW 用于从指定地址开始,在用于从指定地址开始,在程序存储器程序存储器的连续单元中定义的连续单元中定义16位的数据字。位的数据字。存放时,数据字的高存放时,数据字的高8位在前(低地址),低位

13、在前(低地址),低 8位在后(高地址)。位在后(高地址)。例如,例如, DW“AA”;存入存入41H,41HDW“A” ;存入存入00H,41HDW“ABC”; 超过两字节超过两字节,不合法不合法DW 100H, 1ACH, -804;按顺序存入按顺序存入01H、00H、01H、0ACH、0FCH、0DCH14例如例如: ORG 1500H TAB2: DW 1234H, 80H汇编以后汇编以后: (1500H)=12H(1501H)=34H(1502H)=00H(1503H)=80H。12H1503H34H1502H00H1501H80H1500H15(4) 预留存储空间伪指令预留存储空间伪

14、指令 DS 表达式表达式用于从指定地址开始,在用于从指定地址开始,在程序存储器程序存储器中保留中保留指定数目指定数目的的字字节单元节单元作为作为预留存储区预留存储区,供程序运行使用。源程序汇编时,对,供程序运行使用。源程序汇编时,对预留单元不赋值。预留单元不赋值。例如:例如:ADDRTABL: DS 20;从标号从标号ADDRTABL代表的地址开始,预留代表的地址开始,预留20个连续的地址单元个连续的地址单元ORG8100HDS08H;从从8100H地址开始,保留地址开始,保留8个连续的地址单元个连续的地址单元16例如例如: ORG 1000HDS 20HDB 30H, 8FH汇编后:从汇编后

15、:从1000H开始,预留开始,预留 32(20H)个字节的内存单元,然后从个字节的内存单元,然后从1020H开始,按照下一条开始,按照下一条DB指令赋值,即指令赋值,即(1020H)=30H,(1021H)=8FH。 8FH1021H30H1020H101FH1001H1000H1002H17(5) 等值伪指令等值伪指令EQU 将一个数值或寄存器名赋给一个指定的符号名。赋值后,一个数值或寄存器名赋给一个指定的符号名。赋值后,其值在整个程序中有效(其值在整个程序中有效(不能再改变不能再改变)。其中)。其中可以可以是是 地址、标号或表达式,地址、标号或表达式,工作寄存器工作寄存器,其值为,其值为8

16、位或位或16位二进位二进制数。赋值以后的字符名称既可以作制数。赋值以后的字符名称既可以作地址地址使用,也可以作使用,也可以作立即立即数数使用。使用。先定义后使用先定义后使用。例如:例如:TAB EQU 1000H TAB1 EQU TAB MOV DPTR, # TAB 前一条伪指令表示前一条伪指令表示TAB地址的值为地址的值为1000H,后一条表示符号地址,后一条表示符号地址TAB1与与TAB等值(可以互换)。等值(可以互换)。18 (6) 位地址符号定义伪指令位地址符号定义伪指令 BIT 用于给字符名称赋以位地址。经赋值后就可用指令中用于给字符名称赋以位地址。经赋值后就可用指令中BIT左面

17、的字符名称来代替左面的字符名称来代替BIT右边所指出的位。右边所指出的位。 其中其中可以是绝对地址,也可以是符号地址(位符号名称)。可以是绝对地址,也可以是符号地址(位符号名称)。例如:例如:FLG BIT F0 FLG2 BIT 0F0H AI BIT P1.0经以上伪指令定义后,在编程中就可以把经以上伪指令定义后,在编程中就可以把FLG和和AI作为位地址作为位地址来使用。来使用。 19 (7)结束汇编伪指令)结束汇编伪指令ENDEND是汇编语言源程序的结束标志,表示汇编结束。在是汇编语言源程序的结束标志,表示汇编结束。在END以后所写的指令,汇编程序都不予以处理。以后所写的指令,汇编程序都

18、不予以处理。 在一个源程序中只能有在一个源程序中只能有1条条END命令。在同时包含有主程序和命令。在同时包含有主程序和子程序的源程序中,也只能有一个子程序的源程序中,也只能有一个END命令,并放到所有指命令,并放到所有指令的最后;否则,就有一部分指令不能被汇编。令的最后;否则,就有一部分指令不能被汇编。 也是选择项,当源程序为主程序时才具有,且其值也是选择项,当源程序为主程序时才具有,且其值为主程序第为主程序第1条指令的符号地址;当源程序不是主程序时,条指令的符号地址;当源程序不是主程序时,END命令不应带命令不应带项。项。20该伪指令用于给地址赋予DATA前面的符号,赋值后可用该符号代替DA

19、TA后面的片内RAM字节单元地址。(8) DATA伪指令伪指令汇编后,RESULT就表示片内RAM的60H单元,程序后面用片内RAM的60H单元的地方就可以用RESULT。21(9) XDATA伪指令伪指令该伪指令与DATA伪指令基本相同,只是它针对的是。22将一个汇编程序插入到源程序中 (10)INCLUDE 伪指令伪指令$将指定的文件内容立即插入到源程序中,它通常用来将用户自定义的8051符号文件包含到程序中去。23汇编程序的汇编过程汇编程序的汇编过程 汇编有两种方法:手工汇编、机器汇编。汇编有两种方法:手工汇编、机器汇编。 手工汇编过程:手工汇编过程:第一次汇编:确定地址,翻译成各条机器

20、码,第一次汇编:确定地址,翻译成各条机器码,字符标号字符标号原样写出;原样写出;第二次汇编:第二次汇编:标号代真标号代真,将字符标号用所计算出的具体,将字符标号用所计算出的具体地址值或偏移量代换。地址值或偏移量代换。 24源程序源程序 目标程序目标程序 地址地址 ORG 1000H ORG 1000H START START:MOV R0MOV R0,2FH 2FH MOV R2 MOV R2,#00H #00H MOV A MOV A,R0 R0 MOV R3 MOV R3,A A INC R3 INC R3 SJMP SJMP NEXT NEXT LOOP LOOP:INC R0 INC

21、R0 CJNE R0 CJNE R0,#44H#44H,NEXTNEXT INC R2 INC R2 NEXT NEXT:DJNZ R3DJNZ R3,LOOPLOOP MOV MOV 2AH2AH,R2 R2 SJMP $ SJMP $ END END 第一次汇编第一次汇编第二次汇编第二次汇编1000 A82F1002 7A001004 E61005 FB1006 0B1007 80NEXT1009 08100A B644NEXT100D 0A100E DBLOOP1010 8A2A1012 80FEA82F7A00E6FB0B800508B644010ADBF98A2A80FE主要知识点:

22、主要知识点:顺序程序顺序程序; ;分支程序分支程序; ;循环程序循环程序; ; 查表程序查表程序; ;子程序子程序; ;运算程序运算程序 ; ;25u用汇编语言与用高级语言进行程序设计很相似。对于比用汇编语言与用高级语言进行程序设计很相似。对于比较复杂的问题可以先根据题目的要求作出流程图,然后较复杂的问题可以先根据题目的要求作出流程图,然后再根据流程图来编写程序。对于比较简单的问题则可以再根据流程图来编写程序。对于比较简单的问题则可以不作流程因而直接编程。不作流程因而直接编程。u两者的差别还是很大的。一个很重要的差别就在于用汇两者的差别还是很大的。一个很重要的差别就在于用汇编语言编程时,对于编

23、语言编程时,对于数据的存放位置数据的存放位置,以及,以及工作单元的工作单元的安排安排等都要由编程者自己安排。而用高级语言编程时,等都要由编程者自己安排。而用高级语言编程时,这些问题都是由计算机安排的,编程者则不必过问。这些问题都是由计算机安排的,编程者则不必过问。26程序框架 ORG 0000H LJMP MAIN ;跳转至主程序 ORG 0003H LJMP INT0_INT ;跳转至外部中断0的中断服务程序 ORG 000BH LJMP T0_INT ;跳转至定时器0的中断服务程序 ORG 0013H LJMP INT1_INT ;跳转至外部中断1的中断服务程序 ORG 0030H MAI

24、N: ;开始写主程序 END中断入口地址中断入口地址主程序开始主程序开始27u理解程序结构(顺序、分支、循环、子程序);理解程序结构(顺序、分支、循环、子程序);u熟练掌握程序设计的思路方法和技巧;熟练掌握程序设计的思路方法和技巧;u要求掌握典型算法;要求掌握典型算法; 找到分析问题和解决问题的着眼点;找到分析问题和解决问题的着眼点; 学会抓住不同问题的规律性;学会抓住不同问题的规律性; 举一反三,独立思考,有创意,有新意,独到。举一反三,独立思考,有创意,有新意,独到。28一、一、分清指令和伪指令及其功能;分清指令和伪指令及其功能;二、二、高级语言程序设计方法的比较与迁移;高级语言程序设计方

25、法的比较与迁移;三、三、特别注意汇编语言是面向机器的,特别注意汇编语言是面向机器的, 要记住要记住 CPU的资源;的资源; 存储器结构与寻址方式;存储器结构与寻址方式; I/O口、定时口、定时/计数器、中断系统等关键的参数;计数器、中断系统等关键的参数; 寄存器间接寻址中指针的选择和使用技巧。寄存器间接寻址中指针的选择和使用技巧。四、四、从宏观了解从宏观了解MCS-51汇编语言程序的整体结构,汇编语言程序的整体结构, 从微观从微观上理解微机中各组成部分是如何通过程序联系起来。上理解微机中各组成部分是如何通过程序联系起来。分析问题,确定算法分析问题,确定算法根据算法,画出程序流程图根据算法,画出

26、程序流程图分配内存工作区及有关端口地址分配内存工作区及有关端口地址 分配内存工作区,尤其是片内分配内存工作区,尤其是片内RAMRAM的分配,把内存区、的分配,把内存区、堆栈区、各种缓冲区要合理地分配,并确定每个区域的首堆栈区、各种缓冲区要合理地分配,并确定每个区域的首地址,便于编程使用。要确定外部扩展的各种地址,便于编程使用。要确定外部扩展的各种I/OI/O端口的端口的地址、分配地址、分配I/OI/O接口线。接口线。编写程序编写程序上机调试上机调试30顺序结构顺序结构 分支程序结构分支程序结构循环程序结构循环程序结构顺序程序顺序程序是程序设计中的基本模块。顺序程序没有分支,从第是程序设计中的基

27、本模块。顺序程序没有分支,从第一条指令开始依次执行每一条指令,直到最后一条,程序就算一条指令开始依次执行每一条指令,直到最后一条,程序就算执行完毕。执行完毕。特点:特点:比较简单,能完成一定的功能,是构成复杂程序的基础。比较简单,能完成一定的功能,是构成复杂程序的基础。31看几个例题。看几个例题。32例例1 功能:将单字节压缩功能:将单字节压缩BCD码(存于数据内存码(存于数据内存30H单单元)元)分离分离转换转换成成ASCII码放在码放在31H、32H单元。单元。-30H-31H-32H-33H-34H-35H36H36H38H37H68H38HMOV 30H,#68HMOV A,30H;用

28、除法分离;用除法分离MOV B,#10HDIV AB;商商6在在A,余数,余数8在在B中中MOV 31H,B;转换成分离的;转换成分离的BCDMOV 32H,AORL 31H,#30H;存结果存结果ORL 32H,#30H33例例2 功能:功能:将将8位二进制数位二进制数(存于数据内存(存于数据内存30H单元)单元)转换成转换成三位分离的三位分离的BCD码放在码放在31H、32H 、33H单元。单元。-30H-31H-32H-33H-34H02H35H05H36H04H37HFEH38HMOV A,30H;用除法分离;用除法分离MOV B,#10DIV AB;商商25在在A,余数,余数4个位在

29、个位在B中中MOV 31H,BMOV B,#10DIV AB;商商2百位在百位在A,余数,余数5十位在十位在B中中MOV 32H,B ;存结果存结果MOV 33H,A个个十十百百34例例3 功能(功能(例例2的逆运算的逆运算):):将将三位分离的三位分离的BCD码放在码放在31H、32H 、33H单元单元转换成转换成8位二进制数位二进制数(存于数据内(存于数据内存存30H单元)单元) 。-30H-31H-32H-33H-34H02H35H05H36H04H37HFEH38HMOV A,33H;MOV B,#10MUL AB;积积BA,最大,最大20即即33H中存的数不中存的数不能超过能超过2A

30、DD A,32H;百位乘以百位乘以10加十位,在加十位,在A中中MOV B,#10MUL AB;再乘以再乘以10ADD A,31H ;存结果存结果MOV 30H,A个个十十百百35处理过程:将30H单元的内容高3位屏蔽;31H单元内容的高5位屏蔽,高低四位交换,左移一位;然后与30H单元的内容相或,拼装后放到40H单元。36程序如下:程序如下:ORG 0100HMOV A,30H ANL A,#00011111BMOV 30H,A;MOV A,31HANL A,#00000111B ;SWAP A RL A ;ORL A,30H;组装组装MOV 40H,AEND37查表查表 例例55功能:功能

31、:求变量求变量X(0 x5) X(0 x5) 的平方的平方 入口:入口:X X 值存放在片内值存放在片内RAMRAM的的 30H 30H 单元单元出口:出口:X X2 2 值存放在片内值存放在片内RAMRAM的的 31H31H 单元单元 ORG 0000HSTART: MOV DPTR,# TABLE MOV A,30H MOVC A,A+DPTR MOV 31H,A;存结果;存结果 SJMP $ ORG 100HTABLE: DB 00,01,04,09,16,25 END-TABLETABLE-101H-102H19H103H10H104H09H105H04H106H01H107H00H1

32、08H程序存储器38例例6 6 将内部将内部RAM中中20H单元和单元和30H单元的无符号数单元的无符号数相加,结果存入相加,结果存入R0(高位)和(高位)和R1(低位)中。(低位)中。ORGORG0000H0000HLJMPLJMPMAINMAINORGORG0030H0030HMAIN:MAIN:MOVMOVA,20HA,20HCLRCLRC CADDADDA,30HA,30HMOVMOVR1,AR1,ACLRCLRA AADDC ADDC A,#00A,#00MOVMOVR0,AR0,ASJMP SJMP $ $ENDEND39结构:根据不同的条件,进行相应的处理。结构:根据不同的条件,

33、进行相应的处理。通常用条件转移指令形成简单分支结构。通常用条件转移指令形成简单分支结构。如:如: 判(判(A) = Z 或或 NZ ,转移,转移判(判(CY)= 1 或或 0 ,转移,转移判(判(bit)=1 或或 0 ,转移,转移CJNE 比较不相等转移比较不相等转移 40 根据不同的条件,执行根据不同的条件,执行不同的程序段。不同的程序段。JZ、JNZ;JC、JNC;JB、JNB、JBC;CJNE ;正确合理地运用正确合理地运用关键:关键:用条件转移指令实现分支;用条件转移指令实现分支;用无条件转移指令汇合到一用无条件转移指令汇合到一点。点。YesNo41例例1 1、设设a a存放在累加器

34、存放在累加器A A中,中,b b存放在寄存器存放在寄存器B B中,要求按下式中,要求按下式 计算计算Y Y值,并将结果值,并将结果Y Y存于存于R2R2中,试编写程序。中,试编写程序。 a-b a-b (a0a0) Y = Y = a+b a+b (a 0a 0) 解:本题关键是判解:本题关键是判a a是正数,还是负数;是正数,还是负数;由由ACC.7ACC.7便知。便知。 ORG 0030HORG 0030H BRBR: JB ACC.7JB ACC.7,ADD1ADD1 CLR C;CLR C;计算分支计算分支a-ba-b SUBB A SUBB A,B B SJMP DONESJMP D

35、ONE ADD1 ADD1: ADD AADD A,B B;计算分支计算分支a+b DONEDONE: MOV R2,A;MOV R2,A;存结果存结果 SJMP SJMP ENDEND 42例例2 2、如果累加器、如果累加器A A的的D1D0D1D0位都为位都为0 0,则,则R2R2加加1 1,否则,否则,R3R3减减 1 1,试编写程序。,试编写程序。 解:根据解:根据A A和和00000011B00000011B逻辑逻辑“与与”的结果来判定。的结果来判定。 ORG 0030HORG 0030H MOV B MOV B,A A;保存;保存A A ANL A ANL A,#00000011B

36、#00000011B JNZ R3DEC1JNZ R3DEC1 INC R2 INC R2 SJMP DONESJMP DONE R3DEC1 : DEC R3DEC R3;计算分支计算分支 DONEDONE: MOV AMOV A,B;B;恢复恢复A A SJMP $SJMP $ END END D1D0位位都为都为1 ?CJNE A,#03H,R3DEC143CJNE A, #0, Next1LCALL Pr0LJMP ToExitNext1: CJNE A, #1, Next2LCALL Pr1LJMP ToExitNext2: CJNE A, #2, Next3LCALL Pr2LJM

37、P ToExitNext3: CJNE A, #3, Else1LCALL Pr3LJMP ToExitElse1: LCALL PrElseToExit: SJMP $多分支程序的设计类似高级语言中的case。44CJNE A, #0, Next1LCALL Pr0 Next1: CJNE R1, #1, Next2LCALL Pr1Next2: CJNE R2, #5DH, Next3LCALL Pr2 Next3: CJNE R3, #3FH, END1LCALL Pr3 END1: LCALL PrENDToExit: SJMP $轮询一遍45 ORG 0000 MOV A,R7 RL

38、 A ADD A,R7 MOV DPTR,#TAB JMP A+DPTRTAB:LJMP L0 LJMP L1 LJMP L2 LJMP L3L0:INC R0 JMP TOENDL1:INC R1 JMP TOENDL2:INC R2 JMP TOENDL3:INC R3TOEND:SJMP $ENDu根据R7的值,转移到不同的分支中的1个。例中R7=03.46顺序程序顺序程序 每条指令只执行一次;每条指令只执行一次;分支程序分支程序 根据不同条件,会跳过一些指令,而转去根据不同条件,会跳过一些指令,而转去 执行另一些指令执行另一些指令共同点:每条指令至多执行共同点:每条指令至多执行一次一次

39、。但是,实际中有时要求某程。但是,实际中有时要求某程序段序段多次重复执行多次重复执行,需要采用循环结构。,需要采用循环结构。 47循环结构不但使程序简练,而且大大节省存储空间。循环结构不但使程序简练,而且大大节省存储空间。循环程序包含四部分:循环程序包含四部分:、初始化部分(循环计数器、变量置初值)初始化部分(循环计数器、变量置初值)、循环处理部分(主体功能,需要重复执行的部分)循环处理部分(主体功能,需要重复执行的部分) 、循环控制部分(修改地址指针、修改变量、检测循环控制部分(修改地址指针、修改变量、检测循环结束条件)循环结束条件)、循环结束处理部分(对结果分析、处理,存放结果)循环结束处

40、理部分(对结果分析、处理,存放结果)p在具体结构上分:在具体结构上分:先先循环循环后后判断、判断、先先判断判断后后循环。循环。 1、先循环处理后循环控制,称为先循环处理后循环控制,称为“直到型直到型”循环;循环; 2、 先循环控制后循环处理,称为先循环控制后循环处理,称为“当型当型”循环。循环。48循环次数已知,可用计数器控制循环次数;循环次数已知,可用计数器控制循环次数;循环次数未知,根据某种条件判断是否终止循环。循环次数未知,根据某种条件判断是否终止循环。 49 ORG 0030HZero: mov R0,#30H mov R7,#10 mov A,#00HLoop: mov R0,A i

41、nc R0 djnz R7,Loop sjmp $ END30HR023H98H0A8H0FDH00000050ORG 0030HADD1: MOVR3, #00HMOVR4, #00HMOVR2, #nMOVR0, #40HLOOP: MOVA, R3 ;取和的低位取和的低位ADDA, R0 ; 相加相加MOVR3, ACLRAADDC A, R4 ;低位字节向高位字节进位低位字节向高位字节进位MOVR4, AINCR0 ;地址加地址加1DJNZR2, LOOP;未加完继续重复未加完继续重复SJMP$END51例例3把把内部内部RAM中起始地址为中起始地址为BLK1的数据块的数据块传送传送到

42、到外部外部RAM以以BLK2为为 起始地址的区域,直到遇到起始地址的区域,直到遇到“#”字符的字符的ASC码为止。码为止。MOV SP,#6FH MOVR0 ,#BLK1 ;BLK1数据块起始地址数据块起始地址MOVDPTR ,#BLK2 ;BLK2数据块起始地址数据块起始地址XH:MOVA ,R0 ;取数据;取数据PUSHACCCLRCSUBBA ,#23H ;判是否为判是否为“#”字符字符JZSTOPPOPACCMOVX DPTR ,A ;数据传送;数据传送INCR0INCDPTRAJMP XH ;循环控制;循环控制 STOP:SJMP$END52u单重单重循环程序和循环程序和多重多重循环

43、;循环;u多重多重循环(循环嵌套)应注意的问题:循环(循环嵌套)应注意的问题: 只允许只允许外外重循环重循环嵌套嵌套内内重循环重循环 不允许不允许循环相互循环相互交叉交叉 不允许不允许从从外外循环程序循环程序跳跳到到内内循环程序循环程序53Delay: mov R7,#200Del1: mov R6,#123 nopDel2: djnz R6,Del2 djnz R7,Del1 sjmp $ ; (;1us;1us;1us;1us;1us;1us;2us;2us;2us;2usT =200T =200(1+1+123(1+1+1232+2)+12+2)+11us1us =50001us=50m

44、s =50001us=50ms12MHz晶振晶振54统计从统计从32H单元开始的单元开始的14个存储单元有多少的数与个存储单元有多少的数与30 h单元的数相同,统计结果存单元的数相同,统计结果存31 h单元。单元。 ORG 0030H MOV 31h,#00 MOV R2,#14;循环次数14 MOV R0,#32H; 地址指针初值LOOP: MOV A,R0 ; 取数 CJNE A,30H,Next ; 比较是否相等 INC 31H; 统计单元加1 Next: INC R0;指针加1指向下一个 DJNZ R2,LOOP ; 循环是否结束的判断 sjmp $ END55例例6 6、设在、设在8

45、0318031内部内部RAMRAM中存一无符号数的数组,其长度为中存一无符号数的数组,其长度为2020,起始地址是起始地址是30H30H,要求将它们从大到小排序,排序后仍存放在原,要求将它们从大到小排序,排序后仍存放在原区域中。区域中。 解:先举四个数排序的例子解:先举四个数排序的例子内内RAM RAM 第一次外循环第一次外循环 第二次外循环第二次外循环 第三次外循环第三次外循环 30H 0 0 0 3 0 3 0 630H 0 0 0 3 0 3 0 6 31H 0 3 0 2 0 6 0 3 31H 0 3 0 2 0 6 0 3 32H 0 2 0 6 0 2 0 2 32H 0 2 0

46、 6 0 2 0 2 33H 0 6 0 0 0 0 0 0 33H 0 6 0 0 0 0 0 0共共4 1 = 3 次外循环次外循环56这就是所谓的这就是所谓的“冒泡法冒泡法”。4 4个数排序最多经过个数排序最多经过 3 3 次外循环就可排出次外循环就可排出, ,每次外循环都包含每次外循环都包含3 3次内循环。实际上大多情况不用次内循环。实际上大多情况不用 3 3 次外循环就可排完。次外循环就可排完。对于对于2020个数排序也是如此,用不到个数排序也是如此,用不到1919次循环,排序就结束。次循环,排序就结束。为了提高排序速度,程序中为了提高排序速度,程序中可设一可设一交换标志交换标志位位

47、,如,如10H10H位,位,每次循环中:若有交换则每次循环中:若有交换则 SETB 10HSETB 10H 若无交换则若无交换则 CLR 10HCLR 10H 每次循环结束时,测每次循环结束时,测10H10H位,判断排序是否结束位,判断排序是否结束。 57 ORG 0030H First DATA 20H Secend DATA 21H MOV B,#20 MOV SP,#50HL0: MOV R0,#30H CLR F0 DEC B ; 长度计数长度计数 push B LOOP: MOV A,R0 ; 内循环的入口内循环的入口 MOV First,A ; 暂存,为交换作准备暂存,为交换作准备

48、 INC R0 MOV Secend, R0 CJNE A, Secend,Next ; 若若 first second转移转移 Next: JNC NEXT1 ; firstsecond转移,转移,否否则,交换则,交换 MOV R0,First DEC R0 ; 使使R0退格指向小地址退格指向小地址first MOV R0,Second INC R0 ; 恢复恢复R0指向大地址指向大地址second SETB F0 ; 置交换标志置交换标志NEXT1: DJNZ B,LOOP ; 内循环是否结束的判断内循环是否结束的判断 POP B JB F0,L0 ; 判断标志位为判断标志位为1否?外循环

49、否?外循环 sjmp $ ; 结束的判断结束的判断 END58p 子程序是构成单片机应用程序必不可少的部分,通过子程序是构成单片机应用程序必不可少的部分,通过ACALL和和LCALL两条子程序调用指令,可以十分方便地两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。用来调用任何地址处的子程序。p 子程序节省占用的存储单元,使程序简短、清晰,善于灵子程序节省占用的存储单元,使程序简短、清晰,善于灵活的使用子程序,是程序设计的重要技巧之一。活的使用子程序,是程序设计的重要技巧之一。p 子程序必须以子程序必须以RET指令结尾指令结尾.p 在设计、调用子程序时,有以下几点应在设计、调用子程

50、序时,有以下几点应注意注意: 当一段程序需多次应用当一段程序需多次应用,或为多人应用时或为多人应用时,这段程序编为这段程序编为子子程序。程序。59子程序名;子程序功能子程序名;子程序功能;入口参数;出口参数;入口参数;出口参数;占用资源;占用资源;现场的保护与恢复。现场的保护与恢复。子程序名:子程序名: 现场保护现场保护 - - - 现场恢复现场恢复 子程序返回子程序返回retLcall 子程序名子程序名保护现场保护现场: 如果在调用前,如果在调用前,主程序主程序已已经经使用了使用了某些存储单元或寄存某些存储单元或寄存器,器,在调用时,在调用时,这些寄存器和这些寄存器和存储单元存储单元又有其他

51、用途,又有其他用途,就应就应先把这些单元或寄存器中的内先把这些单元或寄存器中的内容压入堆栈保护,调用完后再容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,如果有较多的寄存器要保护,应使主、子程序使用不同的寄应使主、子程序使用不同的寄存器组。存器组。60子程序名;子程序功能;子程序名;子程序功能;入口参数;出口参数入口参数;出口参数;现场的保护与恢复;占用资源。现场的保护与恢复;占用资源。子程序名:子程序名:现场保护现场保护-现场恢复现场恢复子程序返回子程序返回retLcall 子程序名子程序名入口参数入口参数和和出口参数出口参数: 用之前

52、主程序要按子程序的要用之前主程序要按子程序的要求设置好地址单元或存储器(称为求设置好地址单元或存储器(称为入入口参数口参数),以便子程序从指定的地址),以便子程序从指定的地址单元或存储器获得输入数据;单元或存储器获得输入数据; 子程序经运算或处理后的结果子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称存放到指定的地址单元或寄存器(称为为出口参数出口参数),主程序调用后从指定),主程序调用后从指定的地址单元或寄存器读取运算或处理的地址单元或寄存器读取运算或处理后的结果,只有这样,才能完成子程后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。序和主程序间的数据的正确传递。61子程序名;子程序功能;入口参数;出口参数;子程序名;子程序功能;入口参数;出口参数;现场的保护与恢复;占用资源。现场的保护与恢复;占用资源。子程序嵌套子程序嵌套子程序名:子程序名:现场保护现场保护-现场恢复现场恢复子程序返回子程序返回retLcall 子程序名子程序名子程序中可包括对另外子程序子程序中可包括对另外子程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论