《单片机原理与接口技术 课件.ppt》由会员分享,可在线阅读,更多相关《单片机原理与接口技术 课件.ppt(96页珍藏版)》请在金锄头文库上搜索。
1、第四章第四章 汇编语言程序设计汇编语言程序设计4.0 绪绪4.1 汇编语言源程序格式汇编语言源程序格式 4.2 汇编语言源程序的编辑和汇编汇编语言源程序的编辑和汇编4.0 绪绪p评价程序质量的标准程序的执行时间;程序所占用的内存字节数目;程序的逻辑性、可读性;程序的兼容性、可扩展性;程序的可靠性4.0 绪绪p采用汇编语言的优点p占用内存单元和CPU资源少;p程序简短、执行速度快;p可直接调动计算机的全部资源,并可以有效利用计算机的专有特性;p能准确地掌握指令的执行时间,适用于实时控制4.1 汇编语言源程序格式汇编语言源程序格式 4.1.1 编程的步骤编程的步骤4.1.2 汇编语言源程序格式汇编
2、语言源程序格式 4.1.3 伪指令伪指令 4.1.4 编程的方法和技巧编程的方法和技巧4.1.5 汇编语言程序的基本结构汇编语言程序的基本结构 4.1.1 编程的步骤编程的步骤4一、分析问题一、分析问题4二、确定算法二、确定算法4三、画程序流程图三、画程序流程图4四、编写程序四、编写程序根据问题要实现的目标根据问题要实现的目标: : l首先设计硬件电路。首先设计硬件电路。l然后再根据具体的硬件环境进行程序设计。然后再根据具体的硬件环境进行程序设计。 一、分析问题一、分析问题p对需要解决的问题进行分析,以求对问题对需要解决的问题进行分析,以求对问题正确的理解。如:正确的理解。如:解决问题的任务是
3、什么?工作过程是什么?现有的条件,已知数据,对运算的精度 和速度方面的要求?设计的硬件结构是否方便编程? 在编程以前,先要对几种不同的算法进行在编程以前,先要对几种不同的算法进行分析、比较,找出最适宜的算法分析、比较,找出最适宜的算法二、确定算法二、确定算法三、画程序流程图三、画程序流程图p程序流程图是使用各种图形、符号、有向线段等来说明程序设计过程的一种直观的表示。p流程图步骤分得越细致,编写程序是也越方便。p画流程图是程序结构设计是采用的一种重要手段。p一个系统软件有总的流程图(主程序框图)和局部的流程图。椭圆框椭圆框或桶形框或桶形框:表示程序:表示程序的开始或结的开始或结束。束。矩形框矩
4、形框:表示要进行的工作。:表示要进行的工作。菱形框菱形框:表示要判断的事情,菱形:表示要判断的事情,菱形框内的表达式表示要判断的框内的表达式表示要判断的内容。内容。流程图常采用的图形和符号。流程图常采用的图形和符号。圆圆 圈圈:表示连接点:表示连接点指向线指向线:表示程序的流向表示程序的流向流程图常采用的图形和符号。流程图常采用的图形和符号。四、编写程序四、编写程序p汇编语言编写的源程序行(一条语句)包括四 个部分,也叫4个字段。 p这四个字段是: 标号标号: : 操作数操作数 ; ;注释注释 p每个字段之间要用分隔符分隔,而每个字段 内部不能使用分隔符。 4.1.2 汇编语言源程序格式汇编语
5、言源程序格式 p可以用作分隔符的符号有: 空格“ ” 冒号“:” 逗号“,” 分号“;” 例如, LOOPl: MOV A,#00H ;立即数00H送A 4.1.2 汇编语言源程序格式汇编语言源程序格式 p标号是用户定义的符号地址。 p一条指令的标号是该条指令的符号名字,p标号的值是汇编这条指令时指令的地址。 p标号由以英文字母开始的18个字母或数 字串组成,以冒号:结尾。 p标号可以由赋值伪指令赋值。 4.1.2 汇编语言源程序格式汇编语言源程序格式 标 号p如果标号没有赋值,汇编程序就把存放该指令目标码第一字节的存储单元的地址赋给该标号,p所以,标号又叫指令标号。 p注意:系统中保留使用的
6、关键字不能用 作标号。 4.1.2 汇编语言源程序格式汇编语言源程序格式 标 号p对于一条汇编语言指令,这个字段是必不 可少的, p它用一组字母符号表示指令的操作码。 p89C51中,它由指令系统助记符组成。 4.1.2 汇编语言源程序格式汇编语言源程序格式 操作码p汇编语言指令可能要求或不要求操作数。 p若有两个操作数,操作数之间应用逗号分开p操作数字段的内容是复杂多样的, 它可能包括下列诸项:工作寄存器名工作寄存器名 特殊功能寄存器名特殊功能寄存器名标号标号 常常 数数$ $ 表达式表达式 4.1.2 汇编语言源程序格式汇编语言源程序格式 操作数操作数: : 工作寄存器名由PSW.3和PS
7、W.4规定的当前工作寄存器区中的R0R7都可以出现在操作数字段中。 MOV A, R4 MOV A, R0操作数: : 特殊功能寄存器名89C51中的21个特殊功能寄存器的名字都可以作为操作数使用。 MOV A, P1 MOV TMOD, #01H SETB ET0 可以在操作数字段中引用的标号名包括: l赋值标号由汇编命令EQU等赋值的标号可以作为 操作数。 l指令标号 指令标号虽未给赋值,但这条指令的第一 字节地址就是这个标号的值,在以后指令操作数字段中可以引用。操作数: : 标号名LOOPLOOP: MOV A, R2 LJMP LOOPLOOP 操作数: : 标号名p汇编语言指令允许以
8、各种数制表示常数,p常数可以写成二进制、十进制或十六进制。p常数总是要以一个数字开头 若十六进制的 第一个数为AF字符,前面要加零, p数字后要直接跟一个表明数制的字母,B二 进制,H十六进制。 操作数: : 常数 MOV A,#00000111B MOV A,#07H MOV A,#07 MOV A, #0FDH 操作数: : 常数p“$”,用来表示程序计数器的当前值。 p这个符号最常出现在转移指令中, JNB TF0, $表示若TF0为零仍执行该指令,否则往下执行,它等效于 $:JNB TF0, $操作数: : $p汇编程序允许把表达式作为操作数使用。 p在汇编时,计算出表达式的值; 并把
9、该值填入目标码中。 例如, MOV A, SUM +l操作数: : 表达式注 释p注释字段不是汇编语言的功能部分,只是用 于增加程序的可读性。 p注释是汇编语言程序编写中的重要组成部分p以“;”隔开。 4.1.2 汇编语言源程序格式汇编语言源程序格式 例:例:LOOP:MOV A,#00H;立即数立即数00HAp伪指令不是真正的指令,无对应的机器码,伪指令不是真正的指令,无对应的机器码,p在汇编时不产生目标程序,在汇编时不产生目标程序,p只是用来对汇编过程进行某种控制。只是用来对汇编过程进行某种控制。 4.1.3 伪指令伪指令 4.1.3 伪指令伪指令 nORGnENDnEQUnDATAnDB
10、nDWnDSnBITORG ORG 汇编起始命令汇编起始命令p格式:格式:ORG 16位地址位地址p功能:规定该伪指令后面程序的汇编地址,功能:规定该伪指令后面程序的汇编地址,即汇编后生成目标程序存放的起始地址。即汇编后生成目标程序存放的起始地址。p例如:例如: ORG ORG 汇编起始命令汇编起始命令例如:例如: ORG 2000HSTART: MOV A,#64H 规定了规定了START的地址是的地址是2000H,又规定了汇编后的第一条指令码从又规定了汇编后的第一条指令码从2000H开始存开始存放。放。END END 汇编结束指令汇编结束指令格式:格式:END功能:通知汇编程序结束汇编。功
11、能:通知汇编程序结束汇编。在在END之后所有的汇编指令均不予以处理。之后所有的汇编指令均不予以处理。EQU EQU 赋值命令赋值命令p格式:格式:字符名称字符名称 EQU EQU 项(数或汇编符号)项(数或汇编符号)p功能:把功能:把“项项”赋给赋给“字符名称字符名称”。p注意:字符名称不等于标号(其后没有冒号);其注意:字符名称不等于标号(其后没有冒号);其中的项,可以是数,也可以是汇编符号。中的项,可以是数,也可以是汇编符号。EQUEQU赋值赋值过的符号名可以用作数据、代码地址、位地址或一过的符号名可以用作数据、代码地址、位地址或一个立即数。可以是个立即数。可以是8 8位的,也可以是位的,
12、也可以是1616位的。位的。例如:例如:EQU EQU 赋值命令赋值命令例例1 1:AA EQU R1AA EQU R1 MOV A MOV A,AAAA;AAAA代表工作寄存器代表工作寄存器R1R1EQU EQU 赋值命令赋值命令例例2 2: A10 EQU 10A10 EQU 10 DELY EQU 07EBH DELY EQU 07EBH MOV A MOV A,A10A10; A10A10作为片内的一个直接地址作为片内的一个直接地址 LCALL DELYLCALL DELY; DELYDELY作为一个作为一个16 16 位位子程序的入口地址子程序的入口地址DATA DATA 数据地址赋
13、值命令数据地址赋值命令p格式:字符名称格式:字符名称 DATA 表达式表达式p功能:与功能:与EQU类似,类似,p但有以下差别:但有以下差别:1.EQU定义的字符名必须先定义后使用,而定义的字符名必须先定义后使用,而DATA定义的字符名可以后定义先使用。定义的字符名可以后定义先使用。2.用用EQU伪指令可以把一个汇编符号赋给一伪指令可以把一个汇编符号赋给一个名字,而个名字,而DATA只能把数据赋给字符名只能把数据赋给字符名。DATA DATA 数据地址赋值命令数据地址赋值命令3、DATA语句可以把一个表达式的值赋给字语句可以把一个表达式的值赋给字符名称,其中的表达式应是可求值的。符名称,其中的
14、表达式应是可求值的。DATA伪指令在程序中用来定义数据地址伪指令在程序中用来定义数据地址DB DB 定义字节命令定义字节命令p格式:格式:DBDB(项或项表)项或项表)p功能:通知汇编程序从当前功能:通知汇编程序从当前ROMROM地址开始,地址开始,保留一个字节或字节串的存储单元,并存保留一个字节或字节串的存储单元,并存入入DBDB后的数据。后的数据。p注意:注意:项或项表可以是一个字节,用逗号项或项表可以是一个字节,用逗号隔开的字节串或括在单引号中的隔开的字节串或括在单引号中的ASCIIASCII字符字符串。串。p例如例如:DB DB 定义字节命令定义字节命令 ORG 2000H DB 0A
15、3HLIST:DB 26H,03H STR:DB ABC 经汇编后经汇编后(2000H)=A3H, (2001H)=26H, (2002H)=03H, (2003H)=41H,(2004H)=42H, (2005H)=43H,(41H,42H, 43H分别为分别为A,B,C的的ASCII码)码)DW DW 定义字命令定义字命令格式:格式:DW DW 1616位数据项或项表位数据项或项表功能:把功能:把DWDW后的后的1616位数据项或项表从当位数据项或项表从当前地址连续存放。每项数值为前地址连续存放。每项数值为1616位二进制位二进制数,数,高高8 8位先放位先放,低,低8 8位后存放。位后存
16、放。DWDW用于定义一个地址表。用于定义一个地址表。例如:例如:DW DW 定义字命令定义字命令 ORG 1500HTABLE:DW 7234H,8AH,10H 经汇编后经汇编后(1500H)=72H, (1501H)=34H, (1502H)=00H, (1503H)=8AH, (1504H)=00H, (1505H)=10H,DS DS 定义存储空间命令定义存储空间命令格式:格式:DS DS 表达式表达式功能:在汇编时,从指定地址开始保留功能:在汇编时,从指定地址开始保留DSDS之后表达式的值所规定的存储单元以备后之后表达式的值所规定的存储单元以备后用。用。例如:例如:DS DS 定义存储
17、空间命令定义存储空间命令ORG 1000HDS 08HDB 30H,8AH汇编后,汇编后,从从1000H保留保留8个单元,个单元,从从1008H按按DB命令给内存赋值,命令给内存赋值,即(即(1008H)=30H (1009H)=8AHBIT BIT 位地址符号命令位地址符号命令格式:字符名格式:字符名 BIT BIT 位地址位地址功能:把功能:把BITBIT后的位地址值赋给字符名。其后的位地址值赋给字符名。其中字符名不是标号,其后没有冒号,但字中字符名不是标号,其后没有冒号,但字符名是必须的。符名是必须的。BIT BIT 位地址符号命令位地址符号命令例如:例如:A1 BIT P1.0A2 B
18、IT 02H汇编后,汇编后,P1口第口第0位的位地址位的位地址90H就赋给了就赋给了A1,而而A2的值则为的值则为02H。4.1.4 编程的方法和技巧编程的方法和技巧一、模块化的程序设计方法一、模块化的程序设计方法二、编程技巧二、编程技巧一、模块化的程序设计方法一、模块化的程序设计方法1、程序功能模块化的优点、程序功能模块化的优点2、划分模块的原则、划分模块的原则1 1、程序功能模块化的优点、程序功能模块化的优点单个模块结构的程序功能单一,易于编写、调试和单个模块结构的程序功能单一,易于编写、调试和修改。修改。便于分工,从而可使多个程序员同时进行程序的编便于分工,从而可使多个程序员同时进行程序
19、的编写和调试工作,加快软件研制进度。写和调试工作,加快软件研制进度。程序可读性好,便于功能扩充和版本升级。程序可读性好,便于功能扩充和版本升级。对程序的修改可局部进行,其它部分可以保持不变。对程序的修改可局部进行,其它部分可以保持不变。对于使用频繁的子程序可以建立子程序库,便于多对于使用频繁的子程序可以建立子程序库,便于多个模块调用。个模块调用。2 2、划分模块的原则、划分模块的原则每个模块应具有独立的功能,能产生一个明确的结每个模块应具有独立的功能,能产生一个明确的结果,即单模块的功能果,即单模块的功能高内聚性高内聚性。模块之间的控制耦合应尽量简单,数据耦合应尽量模块之间的控制耦合应尽量简单
20、,数据耦合应尽量少,即模块间的少,即模块间的低耦合性低耦合性。控制耦合是指模块进入。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换频繁程度。交换方式、交换量的多少及交换频繁程度。模块长度适中。模块长度适中。20条条100条的范围较合适。条的范围较合适。二、编程技巧二、编程技巧1、尽量采用循环结构和子程序。、尽量采用循环结构和子程序。2、尽量少用无条件转移指令。、尽量少用无条件转移指令。3、对于通用的子程序,考虑到其通用性,除了用于、对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子
21、程序中用到存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出)的其他寄存器的内容应压入堆栈(返回前再弹出),即保护现场。,即保护现场。二、编程技巧二、编程技巧4、在中断处理程序中,除了要保护处理程序中用到、在中断处理程序中,除了要保护处理程序中用到的寄存器外,还要保护标志寄存器。的寄存器外,还要保护标志寄存器。5、用累加器传递入口参数或返回参数比较方便,在、用累加器传递入口参数或返回参数比较方便,在子程序中,一般不必把累加器内容压入堆栈。子程序中,一般不必把累加器内容压入堆栈。4.1.5 汇编语言程序的基本结构汇编语言程序的基本结构一、顺序程序一、顺序程序二、
22、分支程序二、分支程序三、循环程序三、循环程序语句 3语句 2顺序结构顺序结构 入口入口语句 1 出口出口分支结构分支结构入口入口条件满足否? 分支 1 出口出口YN 分支 2循环结构循环结构入口入口 处理 修改条件条件满足否?Y 出口出口N一、顺序程序一、顺序程序顺序程序是最简单的程序结构,即顺顺序程序是最简单的程序结构,即顺序结构。序结构。程序按顺序一条一条地执行指令程序按顺序一条一条地执行指令。例例1 1 双字节加法。被加数地址:addr2,addr1. 加数地址:addr4,addr3. 和在:addr2,addr1中.MOV R0, #addr1MOV R1, #addr3MOV A,
23、 R0ADD A, R1MOV R0, A;和的低字节INC R0INC R1MOV A, R0ADDC A, R1MOV R0, A;和的高字节例例2 2、双字节求补子程序CPLD 算法:正数不变,负数取反+1解: 入口参数:(R7R6) = 待求补码的16位负数 出口参数:(R7R6) = 求补后的16位数CPLD:MOV A, R6CPLA;取反ADDA, #1MOV R6, AMOV A, R7CPLAADDCA, #0MOV R7, ARET例例3 3 拆字。将片内RAM 20H单元的内容拆成两段,每段四位。并将它们分别存入21H与22H单元中。程序如下:ORG 2000HSTART
24、:MOV R0,#21HMOV A, 20HANL A, #0FHMOV R0,AINC R0MOV A, 20HSWAP AANL A, 0FHMOV R0, A二、分支程序二、分支程序程序分支是通过条件转移指令实现的,即根据条件程序分支是通过条件转移指令实现的,即根据条件对程序的执行进行判断、满足条件则进行程序转移,对程序的执行进行判断、满足条件则进行程序转移,不满足条件就顺序执行程序。不满足条件就顺序执行程序。分支程序又分为单分支和多分支结构。分支程序又分为单分支和多分支结构。多分支程序是首先把分支程序按序号排列,然后按多分支程序是首先把分支程序按序号排列,然后按序号值进行转移。序号值进
25、行转移。程序分支判断条件程序分支判断条件p在MCS-51指令系统中,通过条件判断实现单分支程序转移的指令有:JZ、JNZ、CJNE、DJNZ等p此外还有以位状态作为条件进行程序分支的指令如:JC、JNC、JB、JNB、JBC等p使用这些指令可以完成0、1、正、负,以及相等、不相等作为各种条件判断依据的程序转移简单分支程序例例1(2Path.asm1(2Path.asm) )设内部RAM 30H,31H单元中存放两个无符号数,试比较它们的大小,将较小的数存放在30H单元,较大的数存放在31H单元解这是个简单分支程序,可以使用两数相减,若CY=1,则被减数小于减数,采用JC指令进行判断,程序流程图
26、和程序如下:简单分支程序例例1例例2 (3Path.asm)设变量X存入30H单元,求得函数Y存入31H单元。按下式计算Y的值 X+1 (X 10) Y = 0 (10 = X = 5) X-1 (X5)解 要根据X的大小来决定Y值,在判断X10时,采用CJNE和JC以及CJNE和JNC指令进行判断。程序流程图和代码多重分支程序多重分支程序n ORG 100HnSTART: MOV A, 30H ;取取Xn CJNE A, #5, NEXT1 ;与与5比较比较nNEXT1:JCNEXT2 ;X=5n INCR0;假设假设X10, Y=X+1n CJNE A, #11, NEXT3 ;与与11比
27、较比较nNEXT3:JNC NEXT4;X10, 转转NEXT4n MOV R0,#0;10=X=5, Y=0n SJMP NEXT4nNEXT2:MOV R0, An DEC R0;X5. Y=X-1nNEXT4:MOV 31H, R0;存结果存结果n END多路分支程序例例3: 128种分支转移程序。种分支转移程序。功能:根据入口条件转移到功能:根据入口条件转移到128个目的地址。个目的地址。入口:(入口:(R3)=转移目的地址的序号转移目的地址的序号00H7FH。出口:转移到相应子程序入口。出口:转移到相应子程序入口。128个子程序首址JMP_128:MOV A,R3 RL A MOV
28、DPTR,#JMPTAB JMP A+DPTRJMPTAB:AJMP ROUT00 AJMP ROUT01 AJMP ROUT7F说明:此程序要求说明:此程序要求128个转移目的地址(个转移目的地址(ROUT00 ROUT7FH)必须驻留在与绝对转移指令必须驻留在与绝对转移指令AJMP相同的一个相同的一个2KB存储区内。存储区内。RL指令对变址部分乘以指令对变址部分乘以2,因为每条,因为每条AJMP指令占指令占两个字节。两个字节。 分支程序结构散转指令转向0分支转向1分支转向n-1分支转向n分支K=0K=1K=n-1K=n三、循环程序三、循环程序在程序运行时,有时需要连续重复执行某在程序运行时
29、,有时需要连续重复执行某段程序,可以使用循环程序。其结构包括段程序,可以使用循环程序。其结构包括四部分:四部分: 1 1、置循环初值、置循环初值 2 2、循环体(循环工作部分)、循环体(循环工作部分) 3 3、修改控制变量、修改控制变量 4 4、循环控制部分、循环控制部分置初值置初值循环体循环体循环修改循环修改循环控制循环控制退出循环退出循环未完未完完完(a)置初值置初值循环体循环体循环修改循环修改循环控制循环控制退出循环退出循环未完未完完完(b)图 循环组织方式流程图1 1、置循环初值、置循环初值对于循环程序中所使用的工作单元,在循对于循环程序中所使用的工作单元,在循环开始时应置初值。环开始
30、时应置初值。例如,工作寄存器设置计数初值,累加器例如,工作寄存器设置计数初值,累加器A清清0,以及设置地址指针、长度等。,以及设置地址指针、长度等。2 2、循环体(循环工作部分)、循环体(循环工作部分)重复执行的程序段部分,分为循环工作部重复执行的程序段部分,分为循环工作部分和循环控制部分。分和循环控制部分。循环控制部分每循环一次,检查结束条件,循环控制部分每循环一次,检查结束条件,当满足条件时,就停止循环,往下继续执当满足条件时,就停止循环,往下继续执行其他程序行其他程序3 3、修改控制变量、修改控制变量在循环程序中,必须给出循环结束条件。在循环程序中,必须给出循环结束条件。常见的是计数循环
31、,当循环了一定的次数常见的是计数循环,当循环了一定的次数后,就停止循环。后,就停止循环。在单片机中,一般用一个工作寄存器在单片机中,一般用一个工作寄存器Rn作作为计数器,对该计数器赋初值作为循环次为计数器,对该计数器赋初值作为循环次数。每循环一次,计数器的值减数。每循环一次,计数器的值减1,即修改,即修改循环控制变量,当计数器的置件为循环控制变量,当计数器的置件为0时,就时,就停止循环。停止循环。4 4、循环控制部分、循环控制部分根据循环结束条件,判断是否结束循环。根据循环结束条件,判断是否结束循环。8051可采用可采用DJNZ指令指令来自动修改控制变量来自动修改控制变量并能结束循环。并能结束
32、循环。例例1 1在内部RAM 30H4FH连续32个单元中存放单字节无符号数。 求32个无符号数之和,并存放到 RAM 51H、50H中解这是重复相加问题。设用R0作加数地址指针,R7作循环次数计数器,R3作总和数高字节寄存器。程序流程图及代码:循环次数已知的程序p ORG 0000HpSTART: MOV R7, #31 ;R7作循环次数计数p MOV R3, #0 ;R3作和数高字节寄存器p MOV A, 30H ;取第一个被加数p MOV R0, #31H;R0作加数地址指针pLOOP: ADD A, R0;作加法p JNC NEXT ;CY=0, 和X?X送送A循环计数器计数循环计数器
33、计数循环计数器循环计数器0?A送结果单元送结果单元A为正数为正数NNNYY结束结束(B)=89(R0)=20HMOV A,R0(R0)+1 R0SCMPMA:MOV R0,#20H MOV B,#89 MOV A,R0SCLOOP:INC R0 MOV R1,A XRL A,R0 JB ACC.7,RESLAT MOV A,R1 CLR C SUBB A,R0 JNB ACC.7,SMEXT1CXAHER:MOV A,R0 LJMP SMEXT2RESLAT: XRL A,R0 JNB ACC.7,SMEXT2 LJMP CXAHERSMEXT1:ADD A,R0SMEXT2:DJNZ B,S
34、CLOOP MOV 1FH,A;置取数指针;置取数指针R0初值初值;置循环计数器;置循环计数器B初值初值;第一个数送;第一个数送A;修改指针;修改指针;暂存;暂存;判两个数符号是否相同;判两个数符号是否相同;若相异,则转;若相异,则转RESLAT;若相同,则恢复;若相同,则恢复A原来值原来值;C清清0;两数相减,以判两者大小;两数相减,以判两者大小;若;若A为大,则转为大,则转SMEXT1;若;若A为小,则将大数送入为小,则将大数送入A;A 恢复原值恢复原值;若;若A为正,则转为正,则转SMEXT2;若;若A为负,则转为负,则转CXAHER;恢复;恢复A原值原值;所有单元都比较过?未比较完,则
35、继续;所有单元都比较过?未比较完,则继续;最大者送;最大者送1FH单元单元例3:设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(CR= 0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中解:从首单元开始取数,每取一数判断其是否为CR,是则结束循环次数未知的程序示例 ORG 1000H STADA DATA 20H SLANG DATA 1FHCMCR2: MOV R0,#STADA-1 MOV B,#0FFH CRLOP: INC R0 INC B MOVX A,R0 CJNE A,#0DH,CR
36、LOP MOV SLANG,B SJMP $ END 循环次数未知的程序示例编写循环程序应注意的问题编写循环程序应注意的问题(1)进入循环之前,应合理设置循环初始变量(2)循环体只能执行有限次,如果无限执行的话,称之为死循环,这是应当避免的(3)不能破坏或修改循环体,这里要特别注意避免避免从循环体外直接跳转到循环体内(4)多种循环的嵌套,应当是以下两种形式错错(5)循环体内可以直接转到循环体外或外层循环中,实现一个循环多个条件控制结束的结构(6)对循环体的编程要仔细推敲,合理安排,对其优化时应主要放在缩短执行时间上,其次是程序的长度冒泡法排序-A设在8031内部RAM中存一无符号数的数组,其长
37、度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中冒泡法排序共共4 1 = 3 次外循环次外循环解:先举四个数排序的例子解:先举四个数排序的例子内内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 6 0 2 0 2 33H 0 6 0 0 0 0 0 0 33H 0 6 0 0 0 0 0 0这就是所谓的“冒
38、泡法”4个数排序最多经过 3 次外循环就可排出,每次外循环都包含3次内循环。实际上大多情况不用 3次外循环就可排完对于100个数排序也是如此,用不到99次循环,排序就结束为了提高排序速度,程序中可设一交换标志位如10H位每次循环中若有交换则 SETB 10H若无交换则 CLR 10H每次循环结束时,测10H位,判断排序是否结束冒泡法排序冒泡: 假设经过最后一次比较,已经按照规定比较交换完了,按照大小顺序排好了,这时10h还是置1,再从头到尾比较一周期,这次没有交换了,10h始终为0,就结束BUBBLE:MOV R0,#30H MOV B,#64H CLR 10H DEC B ;长度计数长度计数
39、LOOP: MOV A,R0 ;内循环的入口内循环的入口 MOV 20H,A ;暂存,为交换作准备暂存,为交换作准备 INC R0 MOV 21H,R0 CJNE A,21H,BUEU ;若(若(20H)(21H)转移转移 BUEU: JNC NEXT ;(;(20H)(21H)转移转移 MOV A,R0 ;若(若(20H) (21H)则交换则交换 MOV R0,20H DEC R0 ;使使R0退格指向小地址退格指向小地址 MOV R0,A INC R0 ;恢复恢复R0指向大地址指向大地址 SETB 10H ;置交换标志置交换标志NEXT: DJNZ B,LOOP ;内循环是否结束的判断内循环
40、是否结束的判断 JB 10H,BUBBLE ;判断标志位为判断标志位为1否?外循环结束的判断否?外循环结束的判断 END冒泡法排序4.2 汇编语言源程序的编辑和汇编汇编语言源程序的编辑和汇编4.2.1 源程序编辑源程序编辑4.2.2 源程序的汇编源程序的汇编4.2.1 源程序编辑源程序编辑在微型计算机上,借助编辑软件,编在微型计算机上,借助编辑软件,编写或修改汇编语言源程序。如行编辑写或修改汇编语言源程序。如行编辑或屏幕编辑软件。或屏幕编辑软件。4.2.2 源程序的汇编源程序的汇编p汇编:将汇编语言源程序转换为机器码表汇编:将汇编语言源程序转换为机器码表示的目标程序的过程。示的目标程序的过程。
41、p对单片机有:对单片机有: 一、手工汇编一、手工汇编 二、机器汇编二、机器汇编 三、反汇编三、反汇编一、手工汇编一、手工汇编通过手工方式查指令编码表,逐个把助记通过手工方式查指令编码表,逐个把助记符符指令指令“翻译翻译”成机器码,然后把得到的成机器码,然后把得到的机器码程序键入单片机,进行调试和运行。机器码程序键入单片机,进行调试和运行。手工汇编的缺点:手工汇编的缺点: 1、偏移量的计算容易出错、偏移量的计算容易出错 2、程序的修改会引起后面指令地址的变、程序的修改会引起后面指令地址的变化,转移指令的偏移量也要重新计算。化,转移指令的偏移量也要重新计算。二、机器汇编二、机器汇编机器汇编是在计算机上使用交叉汇编程序进机器汇编是在计算机上使用交叉汇编程序进行源程序的汇编。行源程序的汇编。汇编工作由机器自动完成,汇编工作由机器自动完成,最后得到以机器码表示的目标程序。最后得到以机器码表示的目标程序。三、反汇编三、反汇编将二进制机器语言程序翻译成汇编语言程将二进制机器语言程序翻译成汇编语言程序的过程称反汇编。序的过程称反汇编。汇编和反汇编的过程如图所示。汇编和反汇编的过程如图所示。源程序源程序(汇编语言)(汇编语言)目标码目标码(机器语言)(机器语言)汇编(汇编程序)汇编(汇编程序)反汇编(汇编程序)反汇编(汇编程序)图图 汇编和反汇编过程汇编和反汇编过程