




已阅读5页,还剩63页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 51单片机汇编语言程序设计 p5.1 汇编语言源程序的格式 p5.2 伪指令 p5.3 汇编语言源程序的人工汇编 p5.4 MCS-51汇编语言程序的基本结构 与设计举例 1 引言 u计算机能够直接执行的是:0和1组成的机器码指令程序。 u上一章在讲解指令时的程序,其特点是: 1、指令是采用助记符,而不是用机器码表示; 2、地址是采用标号地址(符号地址),而不是真正的实际 地址。 u汇编语言源程序:用助记符和标号地址编写的程序。 u汇编语言面向机器,要经过汇编。 u高级语言 面向算法、过程、对象,类似自然语言,可移植 性好,须经解释或翻译后才能被执行。 2 汇编 汇编 机器语言目标程序机器语言目标程序汇编语言源程序汇编语言源程序 汇编程序汇编程序 p汇编:将汇编语言源程序转换成机器语言目标程序的过 程称为汇编。(可人工汇编或机器汇编) p 汇编程序:能将汇编语言源程序转换成机器语言目标程 序的软件称为汇编程序。(机器汇编) 3 5.1 汇编语言源程序的格式 p MCS-51的汇编语言的四分段格式如下: 标号: 操作码 操作数;注释 规则: (1)标号字段和操作字码段之间要有冒号“:”相隔; (2)操作码字段和操作数字段间的分界符是空格; (3)多操作数之间用逗号相隔; (4)操作数字段和注释字段之间的分界符用分号“;”相隔 。 操作码字段为必选项,其余各段为任选项。 例如: START: MOV A,#00H ;0A NOP 4 基本语法规则: 1标号 是语句所在地址的标志符号。命名规范如下: (1)由18个字母、数字与下划线“-”组成; (2)首字符为字母; (3)同一标号在一个程序中只能定义一次; (4)绝对不允许把指令的保留字、寄存器及伪指令字符 作为语句的标号。 2操作码字段 是汇编语言指令中唯一不能空缺的部分。汇编程序就是 根据这一字段来生成机器代码的。 操作码段也可以是伪指令的助记符,在汇编时起作用。 5 基本语法规则2 3操作数 可以采用字母或数字等多种表示形式。 操作数是立即数,可用二进制、十进制和十六进制形式: 十六进制,后缀“H” 。 二进制,后缀“B” 。 十进制,后缀“D”,也可省略。 若十六进制的操作数以字符AF中的某个开头时, 则需在它前面加一个 “0”,以便在汇编时把它和字符 AF区别开来。 注意数字前加“#”。 带加、减运算符的表达式: 例如:例如:MOV A, MOV A, #100-1#100-1 6 基本语法规则3 对于直接地址direct,有多种选择: (1)直接数据地址(各种进制),如MOV A、30H等; (2)标号地址,如MOV A,SUM等, SUM应该在程序中 某处加以定义; (3)带有加减的表达式,设SUM为已定义的标号地址, 如MOV A,SUM十13; (4)特殊功能寄存器名,如MOV A,P2等。 4 4、 注释段:注释段:注释指令或程序的含义,便于阅读程序 、维护程序。 必须用“;”隔开,续行时,也必须以“;”开头 。 7 基本语法规则4 美元符号$的使用 用于表示该转移指令操作码所在的地址。例如,如下 指令: JNB F0, $ 与如下指令是等价的: HERE:JNB F0,HERE 8 5.2 伪指令 只有在汇编前的源程序中才有伪指令。经过汇编 得到目标程序(机器代码)后,伪指令已无存在的必 要,所以“伪”体现在汇编时,伪指令没有相应的机器 代码产生。 伪指令是告诉汇编程序,如何汇编源程序的指令。 不属于指令系统中的指令。 用来对汇编过程进行某种控制,或者对符号、标号 赋值。 不同版本的汇编语言,基本用法类似,但稍有不同 。 9 伪指令 (1)起始地址伪指令 pp功能:功能:用于设定目标程序段或数据块的起始地址。注意 :地址从小到大,且不能重叠。它放在一段源程序(主程 序、子程序)或数据块的前面,说明紧跟在其后的程序段 或数据块的起始地址就是伪指令中的16位绝对地址或用标 号、表达式表示的地址。一般默认从0000开始。 p例如: ORG 2000H START: MOV A, #7FH p它表明标号为START的目标程序是从2000H单元开始存 放的。 格式格式: : 标号标号: : ORG 16ORG 16位地址位地址 10 (2)定义字节伪指令 DB 格式格式: : 标号标号: DB 8: DB 8位数据表位数据表 功能:功能:用于从指定的地址开始,在程序存储器的连续单元中定 义字节数据。8位数表可以是一字节常数或字符,或用逗号 分开的字节串,或用引号括起来的字符串。 例如: ORG 2000H TAB1: DB 30H, 8AH, 7FH, 73 DB 5, a, BCD 30H 2008H 8AH 2007H 7FH 2006H 49H 2005H 35H2004H 61H 2003H 42H 2002H 43H 2001H 44H 2000H 由于ORG 2000H,所以TAB1的地址为 2000H,因此以上伪指令经汇编以后,将对 2000H开始的若干内存单元赋值。 11 (3)定义数据字伪指令 DW 格式:格式: 标号标号: DW 16: DW 16位数据表位数据表 功能:功能:用于从指定地址开始,在程序存储器的连续单元中定义 16位的数据字。存放时,数据字的高8位在前(低地址),低 8位在后(高地址)。 例如, DW“AA”;存入41H,41H DW“A” ;存入00H,41H DW“ABC”; 超过两字节,不合法 DW 100H, 1ACH, -804 ;按顺序存入01H、00H、01H、0ACH、0FCH、0DCH 12 例如: ORG 1500H TAB2: DW 1234H, 80H 汇编以后: (1500H)=12H (1501H)=34H (1502H)=00H (1503H)=80H。 12H 1503H 34H 1502H00H 1501H 80H 1500H 13 (4) 预留存储空间伪指令 DS 格式格式: : 标号标号: DS : DS 表达式 功能:功能:用于从指定地址开始,在程序存储器中保留指定数目的字 节单元作为预留存储区,供程序运行使用。源程序汇编时,对 预留单元不赋值。 例如:ADDRTABL: DS 20 ;从标号ADDRTABL代表的地址开始,预留20个连续的地址单元 ORG8100H DS08H ;从8100H地址开始,保留8个连续的地址单元 14 例如: ORG 1000H DS 20H DB 30H, 8FH 汇编后:从1000H开始,预留 32(20H) 个字节的内存单元,然后从1020H 开始,按照下一条DB指令赋值,即 (1020H)=30H,(1021H)=8FH。 8FH1021H 30H1020H 101FH 1001H 1000H 1002H 15 (5) 等值伪指令EQU 格式格式: : 字符名称字符名称 EQU EQU 赋值项赋值项 功能:功能:用于给字符名称赋值。赋值后,其值在整个程序中有效( 不能再改变)。其中可以是常数、 地址、标号或表 达式,工作寄存器,其值为8位或16位二进制数。赋值以后的字 符名称既可以作地址使用,也可以作立即数使用。先定义后使 用。 例如:TAB EQU 1000H TAB1 EQU TAB 前一条伪指令表示TAB地址的值为1000H,后一条表示符号地址 TAB1与TAB等值(可以互换)。 16 (6) 位地址符号定义伪指令 BIT 格式:格式: 字符名称字符名称 BIT BIT 位地址位地址 功能:功能:用于给字符名称赋以位地址。经赋值后就可用指令中BIT 左面的字符名称来代替BIT右边所指出的位。 其中 可以是绝对地址,也可以是符号地址(位符号名称)。 例如:FLG BIT F0 AI BIT P1.0 经以上伪指令定义后,在编程中就可以把FLG和AI作为位地址 来使用。 17 (7)结束汇编伪指令END 格式格式: : 标号标号: : END END 功能:功能:END是汇编语言源程序的结束标志,表示汇编结束。在 END以后所写的指令,汇编程序都不予以处理。 在一个源程序中只能有1条END命令。在同时包含有主程序和 子程序的源程序中,也只能有一个END命令,并放到所有指 令的最后;否则,就有一部分指令不能被汇编。 也是选择项,当源程序为主程序时才具有,且其值 为主程序第1条指令的符号地址;当源程序不是主程序时, END命令不应带项。 18 格式:格式: 符号符号 DATA DATA 直接字节地址直接字节地址 功能:功能:该伪指令用于给片内片内RAMRAM字节单元字节单元地址赋予 DATA前面的符号,赋值后可用该符号代替DATA后面的片 内RAM字节单元地址。 (8) DATA伪指令 【例例】 RESULT DATA 60H RESULT DATA 60H MOV RESULT,AMOV RESULT,A 汇编后,RESULT就表示片内RAM的60H单元,程序 后面用片内RAM的60H单元的地方就可以用RESULT。 19 【例例】 PORT1 XDATA 2000HPORT1 XDATA 2000H MOV DPTR,#PORT1MOV DPTR,#PORT1 MOVX DPTR,AMOVX DPTR,A 汇编后,符号汇编后,符号PORT1PORT1就表示片外就表示片外RAMRAM的的2000H2000H单元地址,程单元地址,程 序后面可通过符号序后面可通过符号PORT1PORT1表示片外表示片外RAMRAM的的2000H2000H单元地址。单元地址。 (9) XDATA伪指令 格式:格式: 符号符号 XDATA XDATA 直接字节地址直接字节地址 该伪指令与DATA伪指令基本相同,只是它针对的是片片 外外RAMRAM字节单元字节单元。 20 判断正误 ORG 0000 LEN1 DATA 31H LEN2 EQU 32H MOV A, LEN1+1 MOV B,LEN2+1 MOV R1,#LEN1 MOV R2,#LEN2 MOV R2,#LEN2+LEN1 ;CNT1 DATA R5CNT1 DATA R5 CNT2 EQU R6 ;CNT EQU ADDCNT EQU ADD MOV R3,#LEN1+1 MOV R4,#LEN2+1 MOV DPTR,#TOEND TOEND:SJMP $ LEN1 DATA 31H LEN2 EQU 32H END 不能重复定义! 要有先定义的习惯 。 21 5.3 汇编语言源程序的人工汇编 汇编程序的汇编过程 汇编有两种方法:手工汇编、机器汇编。 手工汇编过程: 第一次汇编:确定地址,翻译成各条机器码,字符标号 原样写出; 第二次汇编:标号代真,将字符标号用所计算出的具体 地址值或偏移量代换。 22 源程序 目标程序 地址 ORG 1000H START:MOV R0,2FH MOV R2,#00H MOV A,R0 MOV R3,A INC R3 SJMP NEXT LOOP:INC R0 CJNE R0,#44H,NEXT INC R2 NEXT:DJNZ R3,LOOP MOV 2AH,R2 SJMP $ END 第一次汇编第二次汇编 1000 A82F 1002 7A00 1004 E6 1005 FB 1006 0B 1007 80NEXT 1009 08 100A B644NEXT 100D 0A 100E DBLOOP 1010 8A2A 1012 80FE A82F 7A00 E6 FB 0B 8005 08 B64401 0A DBF9 8A2A 80FE 23 5.4 MCS-51汇编语言程序的基本结构 与设计举例 主要知识点:顺序程序;分支程序;循环程序; 查表程序;子程序;运算程序 ; u用汇编语言与用高级语言进行程序设计很相似。对于比 较复杂的问题可以先根据题目的要求作出流程图,然后 再根据流程图来编写程序。对于比较简单的问题则可以 不作流程因而直接编程。 u两者的差别还是很大的。一个很重要的差别就在于用汇 编语言编程时,对于数据的存放位置,以及工作单元的 安排等都要由编程者自己安排。而用高级语言编程时, 这些问题都是由计算机安排的,编程者则不必过问。 24 程序框架 1. ORG 0000H 2. LJMP MAIN ;跳转至主程序 3. ORG 0003H 4. LJMP INT0_INT ;跳转至外部中断0的中断服务程序 5. ORG 000BH 6. LJMP T0_INT ;跳转至定时器0的中断服务程序 7. ORG 0013H 8. LJMP INT1_INT ;跳转至外部中断1的中断服务程序 9. 10.ORG 0030H 11.MAIN: ;开始写主程序 12. END 中断入口地址 主程序开始 25 程序设计的学习目标程序设计的学习目标 u理解程序结构(顺序、分支、循环、子程序); u熟练掌握程序设计的思路方法和技巧; u要求掌握典型算法; 找到分析问题和解决问题的着眼点; 学会抓住不同问题的规律性; 举一反三,独立思考,有创意,有新意,独到。 26 汇编语言程序设计的要点:汇编语言程序设计的要点: 一、分清指令和伪指令及其功能; 二、高级语言程序设计方法的比较与迁移; 三、特别注意汇编语言是面向机器的, 要记住 CPU的资源; 存储器结构与寻址方式; I/O口、定时/计数器、中断系统等关键的参数; 寄存器间接寻址中指针的选择和使用技巧。 四、从宏观了解MCS-51汇编语言程序的整体结构, 从微观 上理解微机中各组成部分是如何通过程序联系起来。 27 汇编语言程序的基本结构 顺序结构 分支程序结构 循环程序结构 28 5.4.1 顺序程序设计 顺序程序是程序设计中的基本模块。顺序程序没有分支, 从第一条指令开始依次执行每一条指令,直到最后一条, 程序就算执行完毕。 特点:比较简单,能完成一定的功能,是构成复杂程序的 基础。 看几个例题。 29 例1 功能:将单字节压缩BCD码(存于数据内存30H单 元)分离转换成ASCII码放在31H、32H单元。 - 30H - 31H - 32H - 33H -34H - 35H 36H 36H 38H 37H 68H 38H MOV 30H,#68H MOV A,30H;用除法分离 MOV B,#10H DIV AB;商6在A,余数8在B中 MOV 31H,B;转换成分离的BCD MOV 32H,A ORL 31H,#30H;存结果 ORL 32H,#30H 30 例2 功能:将8位二进制数(存于数据内存30H单元) 转换成三位分离的BCD码放在31H、32H 、32H单元。 - 30H - 31H - 32H - 33H -34H 02H 35H 05H 36H 04H 37H FEH 38H MOV A,30H;用除法分离 MOV B,#10 DIV AB;商25在A,余数4个位在B中 MOV 31H,B MOV B,#10 DIV AB;商2百位在A,余数5十位在B中 MOV 32H,B ;存结果 MOV 33H,A 个 十 百 31 例3 功能(例2的逆运算):将三位分离的BCD码放在 31H、32H 、32H单元转换成8位二进制数(存于数据内存 30H单元) 。 - 30H - 31H - 32H - 33H -34H 02H 35H 05H 36H 04H 37H FEH 38H MOV A,33H; MOV B,#10 MUL AB;积BA,最大20 ADD A,32H;百位乘以10加十位,在A中 MOV B,#10 MUL AB;再乘以10 ADD A,31H ;存结果 MOV 30H,A 个 十 百 32 处理过程:将30H单元的内容高3位屏蔽;31H单元内容的 高5位屏蔽,高低四位交换,左移一位;然后与30H单元的 内容相或,拼装后放到40H单元。 【例例4 4】数据的拼拆数据的拼拆 设在设在30H30H和和31H31H单元中各有一个单元中各有一个8 8位数据位数据: : (30H30H)=X=X 7 7X X6 6 X X5 5X X4 4X X3 3X X2 2X X1 1X X 0 0 (3lH3lH)=Y=Y 7 7Y Y6 6Y Y5 5Y Y4 4Y Y3 3Y Y2 2Y Y1 1Y Y 0 0 现在要从现在要从30H30H单元中取出低单元中取出低5 5位,并从位,并从31H31H单元中取出低单元中取出低3 3位完位完 成拼装,拼装结果送成拼装,拼装结果送40H40H单元保存,并且规定单元保存,并且规定: : (40H40H)= =Y Y 2 2Y Y1 1Y Y0 0X X4 4X X3 3X X2 2X X1 1X X 0 0 33 程序如下: ORG 0100H MOV A,30H ANL A,#00011111B MOV 30H,A; MOV A,31H ANL A,#00000111B ; SWAP A RL A ; ORL A,30H;组装 MOV 40H,A END (30H30H)=X=X 7 7X X6 6 X X5 5X X4 4X X3 3X X2 2X X1 1X X 0 0 (3lH3lH)=Y=Y 7 7Y Y6 6Y Y5 5Y Y4 4Y Y3 3Y Y2 2Y Y1 1Y Y 0 0 (40H40H)= =Y Y 2 2Y Y1 1Y Y0 0X X4 4X X3 3X X2 2X X1 1X X 0 0 (30H30H)=0 0 0 =0 0 0 X4X3X2X1X0X4X3X2X1X0 A=A=Y2Y1Y0 Y2Y1Y0 0 0 0 0 00 0 0 0 0 A=0 0 0 0 0 A=0 0 0 0 0 Y2Y1Y0 Y2Y1Y0 34 查表 例5 功能:求变量X(0x5) 的平方 入口:X 值存放在片内RAM的 30H 单元 出口:X2 值存放在片内RAM的 31H 单元 ORG 0000H START: MOV DPTR,# TABLE MOV A,30H MOVC A,A+DPTR MOV 31H,A;存结果 SJMP $ ORG 100H TABLE: DB 00,01,04,09,16,25 END - TABLE - 101H - 102H 19H 103H 10H104H 09H 105H 04H 106H 01H 107H 00H 108H 程序存储器 35 5.4.2 分支程序设计 结构:根据不同的条件,进行相应的处理。 通常用条件转移指令形成简单分支结构。 如: 判(A) = Z 或 NZ ,转移 判(CY)= 1 或 0 ,转移 判(bit)=1 或 0 ,转移 CJNE 比较不相等转移 36 用条件转移语句实现二分支用条件转移语句实现二分支 根据不同的条件,执行 不同的程序段。 JZ、JNZ; JC、JNC; JB、JNB; CJNE 等; 正确合理地运用 关键: 用条件转移指令实现分支; 用无条件转移指令汇合到一 点。 条件条件 语句组语句组1 1语句组语句组2 2 Yes No 入口入口 出口出口 37 例1、设a存放在累加器A中,b存放在寄存器B中,要求按下式 计算Y值,并将结果Y存于R2中,试编写程序。 a-b (a0) Y = a+b (a 0) 解:本题关键是判a是正数,还是负数;由ACC.7便知。 ORG 0000H BR: JB ACC.7,ADD1 CLR C;计算分支a-b SUBB A,B SJMP DONE ADD1: ADD A,B;计算分支a+b DONE: MOV R2,A;存结果 SJMP END 38 例2、如果累加器A的D1D2位都为0,则R2加1,否则,R3减 1,试编写程序。 解:根据A和00000011B逻辑“与”的结果来判定。 ORG 0000H MOV B,A;保存A ANL A,#00000011B JNZ R3DEC1 INC R2 SJMP DONE R3DEC1 : DEC R3;计算分支a+b DONE: MOV A,B;恢复A SJMP $ END A=DA=D 7 7D D6 6D D5 5D D4 4D D3 3D D2 2 0 00 0 D1D2位 都为1 ? CJNE A,#03H,R3DEC1 再进一步思考?再进一步思考? A=DA=D7 7 1 1 1 11 1 D D 3 3D D2 2 0 00 0 39 分析程序-例3 CJNE A, #0, Next1 LCALL Pr0 LJMP ToExit Next1: CJNE A, #1, Next2 LCALL Pr1 LJMP ToExit Next2: CJNE A, #2, Next3 LCALL Pr2 LJMP ToExit Next3: CJNE A, #3, Else1 LCALL Pr3 LJMP ToExit Else1: LCALL PrElse ToExit: SJMP $ 多分支程序的设计 类似高级语言中的 case。 40 分析程序例4 CJNE A, #0, Next1 LCALL Pr0 Next1: CJNE R1, #1, Next2 LCALL Pr1 Next2: CJNE R2, #5DH, Next3 LCALL Pr2 Next3: CJNE R3, #3FH, END1 LCALL Pr3 END1: LCALL PrEND ToExit: SJMP $ 轮询一遍 41 散转多分支程序设计-例5 ORG 0000 MOV A,R7 RL A ADD A,R7 MOV DPTR,#TAB JMP A+DPTR TAB:LJMP L0 LJMP L1 LJMP L2 LJMP L3 L0:INC R0 JMP TOEND L1:INC R1 JMP TOEND L2:INC R2 JMP TOEND L3:INC R3 TOEND:SJMP $ END u根据R7的值,转移到不同的分支中的1个。例中R7=03. 42 5.4.3 循环程序设计 顺序程序 每条指令只执行一次; 分支程序 根据不同条件,会跳过一些指令,而转去 执行另一些指令 共同点:每条指令至多执行一次。但是,实际中有时要求某程 序段多次重复执行,需要采用循环结构。 43 循环程序包含四部分 循环结构不但使程序简练,而且大大节省存储空间。 循环程序包含四部分: 、初始化部分 (循环计数器、变量置初值) 、循环处理部分(主体功能,需要重复执行的部分) 、循环控制部分(修改地址指针、修改变量、检测 循环结束条件) 、循环结束处理部分(对结果分析、处理,存放结果) p在具体结构上分:先循环后判断、先判断后循环。 1、先循环处理后循环控制,称为“直到型”循环; 2、 先循环控制后循环处理,称为“当型”循环。 44 循环程序框图 计数型:计数型:循环次数已知,可用计数器控制循环次数; 条件型:条件型:循环次数未知,根据某种条件判断是否终止循环。 45 例例1 1:内部数据区清零:内部数据区清零 ORG 0000H Zero: mov R0,#30H mov R7,#10 mov A,#00H Loop: mov R0,A inc R0 djnz R7,Loop sjmp $ END 内部内部RAMRAM 30HR023H 98H 0A8H 0FDH 0 0 0 0 0 0 1010个个 46 例2 :n个单字节数相加,和为双字节。单字节数据存在 40H开始的RAM单元中,n放在R2中,和存放在R4R3中。 ORG 030h ADD1: MOVR3, #00H MOVR4, #00H MOVR2, #n MOVR0, #40H LOOP: MOVA, R3 ;取和的低位 ADDA, R0 ; 相加 MOVR3, A CLRA ADDC A, R4 ;低位字节向高位字节进位 MOVR4, A INCR0 ;地址加1 DJNZR2, LOOP;未加完继续重复 SJMP$ END 47 例3把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2 为 起始地址的区域,直到遇到“#”字符的ASC码为止。去掉块长度。去掉块长度。 ORGORG0030H0030H BLK1BLK1EQUEQU30H30H BLK2BLK2EQUEQU1000H1000H MOV SP,#6FH MOVR0 ,#BLK1 ;BLK1数据块起始地址 MOVDPTR ,#BLK2 ;BLK2数据块起始地址 XH: MOVA ,R0 ;取数据 PUSHACC CLRC SUBBA ,#23H ;判是否为“#”字符 JZSTOP POPACC MOVX DPTR ,A ;数据传送 INCR0 INCDPTR AJMP XH ;循环控制 STOP:SJMP$ END 48 多重循环(循环嵌套) u单重循环程序和多重循环; u多重循环(循环嵌套)应注意的问题: 只允许外重循环嵌套内重循环 不允许循环相互交叉 不允许从外循环程序跳到内循环程序 49 例例4 4:50ms50ms延时程序延时程序 Delay: mov R7,#200 Del1: mov R6,#123 nop Del2: djnz R6,Del2 djnz R7,Del1 sjmp $ ; (不计入不计入) ) ;1us ;1us ;1us ;2us ;2us T =200(1+1+1232+2)+11us =50001us=50ms 12MHz晶振 50 例5-统计 ; 统计从32H单元开始的14个存储单元有多少的数与 30 h单元的数相同,统计结果存31 h单元。 ORG 0000H 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 $ END 51 例6、设在8031内部RAM中存一无符号数的数组,其长度为20, 起始地址是30H,要求将它们从大到小排序,排序后仍存放在原 区域中。 解: 先举四个数排序的例子 内RAM 第一次外循环 第二次外循环 第三次外循环 30H 0 0 0 3 0 3 0 6 31H 0 3 0 2 0 6 0 3 32H 0 2 0 6 0 2 0 2 33H 0 6 0 0 0 0 0 0 共4 1 = 3 次外循环 52 这就是所谓的“冒泡法”。 4个数排序最多经过 3 次外循环就可排出,每次外循环都包含3 次内循环。实际上大多情况不用 3 次外循环就可排完。 对于20个数排序也是如此,用不到19次循环,排序就结束。为 了提高排序速度,程序中可设一交换标志位,如10H位, 每次循环中:若有交换则 SETB 10H 若无交换则 CLR 10H 每次循环结束时,测10H位,判断排序是否结束 。 53 ORG 0000H First DATA 20H Secend DATA 20H MOV B,#8 MOV SP,#50h L0: MOV R0,#30H CLR F0 DEC B ; 长度计数 push B LOOP: MOV A,R0 ; 内循环的入口 MOV First,A ; 暂存,为交换作准备 INC R0 MOV Secend H, R0 CJNE A, Secend,Next ; 若first second转移 Next: JNC NEXT1 ; firstsecond转移 54 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否?外循环 sjmp $ ; 结束的判断 END 55 5.4.4 子程序设计 p 子程序是构成单片机应用程序必不可少的部分,通过 ACALL和LCALL两条子程序调用指令,可以十分方便地用 来调用任何地址处的子程序。 p 子程序节省占用的存储单元,使程序简短、清晰,善于灵 活的使用子程序,是程序设计的重要技巧之一。 p 子程序必须以RET指令结尾. p 在设计、调用子程序时,有以下几点应注意: 当一段程序需多次应用,或为多人应用时,这段程序编为子 程序。 56 在设计、调用子程序时,有以下几点应注意 : 子程序名;子程序功能;入口参数;出口参数; 占用资源;现场的保护与恢复。 子程序名: 现场保护 - - - 现场恢复 子程序返回ret Lcall 子程序名 保护现场。 如果在调用前,主程序已 经使用了某些存储单元或寄存 器,在调用时,这些寄存器和 存储单元又有其他用途,就应 先把这些单元或寄存器中的内 容压入堆栈保护,调用完后再 从堆栈中弹出以便加以恢复。 如果有较多的寄存器要保护, 应使主、子程序使用不同的寄 存器组。 57 注意:入口参数和出口参数。 子程序名;子程序功能;入口参数;出口参数; 现场的保护与恢复;占用资源。 子程序名: 现场保护 - - - 现场恢复 子程序返回ret Lcall 子程序名 入口参数和出口参数。 用之前主程序要按子程序的要 求设置好地址单元或存储器(称为入 口参数),以便子程序从指定的地址 单元或存储器获得输入数据; 子程序经运算或处理后的结果 存放到指定的地址单元或寄存器(称 为出口参数),主程序调用后从指定 的地址单元或寄存器读取运算或处理 后的结果,只有这样,才能完成子程 序和主程序间的数据的正确传递。 58 注意:子程序嵌套 子程序名;子程序功能;入口参数;出口参数; 现场的保护与恢复;占用资源。子程序嵌套 子程序名: 现场保护 - - - 现场恢复 子程序返回ret Lcall 子程序名 子程序中可包括对另外子程序 的调用,称为子程序嵌套。 正在执行主程 序 CPU正在执行 子程序SubA CPU正在执行 子程序SubB 59 子程序-例1 例:例: ORG 0000HORG 0000H Main: Main: movmov sp,#5FH sp,#5FH movmov R0R0,#40H,#40H movmov R7R7,#10H,#10H LcallLcall ZeroZero sjmpsjmp $ $ ;子程序名:Zero ;功能:对内部数据区清零 ;入口参数:R0内部数据区 ; R7内部数据区长
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国际化存储芯片晶圆切割及配套服务采购协议
- 高层酒店通风与防排烟系统安装工程合同
- 深度融合中西教育理念的国际学校合作办学合同
- 住宅维修基金代管与买卖合同
- 2025年物业管理师职业能力测试卷:物业管理项目招投标与合同管理试题
- 智能建筑系统开发合同
- 智能家居设备语音开发合同
- 网上购物平台交易合同
- 智能医疗辅助系统开发合同
- 2025年外墙装饰设计合同7篇
- 《水果品质鉴定》课件
- 施工安全管理体系模板3篇
- 朱玉贤《现代分子生物学》(第5版)配套题库【考研真题+章节题库】
- 物流系统仿真技术知到智慧树章节测试课后答案2024年秋山东交通学院
- 《人际关系冲突》课件
- 制造业循环水处理系统方案
- 航空航天器智能维护系统
- 不合格品管理制度(6篇)
- 二零二四年度新能源汽车充电站建设总承包合同2篇
- 精神科患者隐私保护制度
- 2024年江苏省泰州市保安员理论考试题库及答案(完整)
评论
0/150
提交评论