《第4章_MCS-51单片机汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第4章_MCS-51单片机汇编语言程序设计.ppt(46页珍藏版)》请在三一文库上搜索。
1、第四章 MCS-51 单片机 汇编语言程序设计,【学习目的和要求】 了解汇编语言程序设计中的顺序结构、分支结构、循环结构程序和子程序的设计方法。 掌握代码转换和算术运算程序的基本编程方法和一些常用的子程序段,能正确地使用MCS-51指令编制汇编语言程序。,第四章 MCS-51单片机汇编语言程序设计,4.1 汇编语言程序设计方法,4.2 代码转换类程序,4.3 运算类程序,第四章 MCS-51单片机汇编语言程序设计,4.1 汇编语言程序设计方法,汇编语言特点:高效、便捷,用汇编语言编写一个程序的过程分为3步: (1) 分析课题,确定计算方法、运算步骤和顺序,画出流程图。 (2) 确定数据,包括工
2、作单元的数量,分配存放单元。 (3) 按所使用计算机的指令系统,根据流程图编写汇编语言程序。,顺序程序、分支程序和循环程序,再加上广泛使用的子程序和中断服务子程序。 1顺序程序 2分支程序 程序中含有转移指令, 无条件分支,有条件分支 有条件分支又分为:单分支结构和多分支结构。 3循环程序 4子程序 5中断服务子程序,第四章 MCS-51单片机汇编语言程序设计,1、顺序程序,顺序程序的特点和设计方法: 结构比较简单,按程序编写顺序依次执行,程序流向不变。 使用数据传送类指令较多,程序中没有控制转移类指令。 可作为复杂程序中的某一组成部分。,第四章 MCS-51单片机汇编语言程序设计,【例4-1
3、】 双字节二进制数求补。,程序说明:对R3(高8位)、R2(低8位)中的二进制定 点数取反加1即可得到其互补数。,程序清单: BINPL:MOV A,R2 CPL A ;低位字节取反 ADD A,#01H ;加1 MOV R2,A ;低位字节补码送R2 MOV A,R3 CPL A ;高位字节取反 ADDC A,#00H ;加进位 MOV R3,A ;高位字节补码送R3 RET,第四章 MCS-51单片机汇编语言程序设计,2分支程序,特点是程序中含有转移指令,转移指令有分为无条件转移和有条件转移,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。有条件分支转移程序按结构类型来分,又分
4、为单分支转移结构和多分支转移结构。 一、分支转移结构 1单分支转移结构 一个入口,两个出口,两者选一。 JZ JNZ CJNE DJNZ JNC JB JNB JBC,第四章 MCS-51单片机汇编语言程序设计,【例4-2】设变量x存放在VAR单元之中,函数值 y存放在FUNC中,按下式给y赋值:,程序清单: VAR EQU 30H FUNC EQU 31H START:MOV A,VAR ;取x JZ COMP ;为0,转COMP JNB ACC.7, POSI ;0,转POSI MOV A,#0FFH ;0,-1送入A SJMP COMP POSI: MOV A, #01H ;+1送入A
5、COMP:MOV FUNC, A END,2多分支转移结构 程序的判别部分有两个以上的出口流向。 常见的两种多分支选择指令: 间接转移指令: JMP A+DPTR; 比较转移指令: CJNE A,direct,rel; CJNE A,#data,rel; CJNE Rn,#data,rel; CJNE Ri,#data,rel;,第四章 MCS-51单片机汇编语言程序设计,【例4-3】32个分支转移程序。根据入口条件转移到32个 目的地址。 入口:(R3)转移目的地址的序号00H-1FH。 出口:转移到相应子程序入口。,程序清单: MP: MOV A,R3 ;取序号 RL A ;序号乘2 MO
6、V DPTR, #JTAB ;32个子程序 首地址送DPTR JMP A+DPTR ;根据序号转移 JTAB: AJMP ROUT00 ;32个子程序首地址 AJMP ROUT01 AJMP ROUT31,第四章 MCS-51单片机汇编语言程序设计,3循环程序,包括:循环初始化、循环处理、循环控制、 循环结束,计数循环控制结构 条件控制结构 图4-4 循环程序流程图的两种组织方式,第四章 MCS-51单片机汇编语言程序设计,【例4-4】若Xi均为单字节数,并按i(i=1n)的顺序存放在内部 RAM从50H开始的单元中,n放在R2中,要求将它们 的和(双字节)放在R3、R4中。,程序清单: AD
7、D1: MOV R3,#00H ;清和存储单元 MOV R4,#00H MOV R2,# n ;置循环计数初值 MOV R0,#50H LOOP: MOV A, R4 ;取部分和低位 ADD A,R0 ;与Xi相加 MOV R4,A INC R0 ;Xi地址加1 CLR A ADDC A, R3 ;低位字节向高位进位 MOV R3,A DJNZ R2,LOOP ;未加完继续重复 END,入口:Xi存放在从50H开始的单元; n放在R2中。 出口:和存放于R3、R4中,第四章 MCS-51单片机汇编语言程序设计,【例4-5】已知8051单片机使用的晶振为6MHz,要求 设计一个软件延时程序,延时
8、时间为10ms。,延时程序的延时时间主要与所用晶振频率和延时程序中的循环次数有关。由晶振频率为6MHz可知,一个机器周期为2 。 入口:(R0)=毫秒数;(R1)=1ms延时预定值。 出口:定时到,退出程序。,程序清单: ORG 2000H 周期数 MOV R0, #0AH ;毫秒数R0 1 DL2: MOV R1, #MT ;1ms延时值R1 1 DL1: NOP 1 NOP 1 DJNZ R1,DL1 ;1ms延时循环 2 DJNZ R0,DL2 ;10ms延时循环 2 END,该延时程序实际上是一个双重循环程序。内循环的预定值 MT尚需计算: (1+1+2) 2 MT=1000(s )
9、MT=125=7DH,用7DH代替程序中的MT,则该程序执行后,能实现10ms的延时。若考虑其他指令的时间因素,则该段延时程序的精确延时时间应为: 12 s +(1+2)2 s +(1+1+2)2 s 12510=10062(s ),第四章 MCS-51单片机汇编语言程序设计,4、子程序设计,子程序的特点和设计方法: 子程序的第一条指令的地址为子程序的入口地址,该指令前应有标号。 主程序中用调用指令调用子程序,在子程序末尾用返回指令从子程序返回到主程序。 在子程序的开始,使用压栈指令把需要保护的内容压入堆栈;在返回主程序前,使用弹出指令把堆栈中保护的内容送回原来的寄存器或存储单元中。 在子程序
10、中尽量使用相对转移指令,以便子程序放在内存的任何区域都能被主程序调用。 子程序的入口参数由主程序通过相关的工作寄存器、特殊功能寄存器、片内RAM或堆栈等传递给子程序;子程序的出口参数由子程序通过相关的工作寄存器、特殊功能寄存器、片内RAM或堆栈等传递给主程序。,第四章 MCS-51单片机汇编语言程序设计,【例4-6】用程序实现 ,设a、b、c分别存于内部RAM 的30H、31H、32H 单元。,主程序清单: STAR: MOV A,30H ACALL SQR ;调用查表子程序 MOV R1,A ; 暂存R1中 MOV A,31H ACALL SQR ;调查表子程序 ADD A,R1 ;平方和存
11、A中 MOV 32H,A SJMP $ ;等待 子程序清单: SQR: INC A ;加RET占的一个字节 MOVC A,A+PC ;查平方表 RET TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END 子程序入口条件:(A)=待查表的数。 出口条件:(A)=平方值。,第四章 MCS-51单片机汇编语言程序设计,4.2 代码转换类程序,(1) 双字节二进制数转换成BCD数。,转换方法:因为 所以将二进制数从最高位逐次左移入 BCD码寄存器的最低位,并且每次都 实现 的运算。共循环 16次,由R7控制。,入口: R3R2(16位无符号二进制整数)。 出口: R6(万
12、位)、R5(千位、百位)、 R4(十值、个位)存放5位BCD码。,第四章 MCS-51单片机汇编语言程序设计,程序清单: BCBCD: CLR A ;BCD码寄存器清零 MOV R4,A MOV R5,A MOV R6,A MOV R7,#10H ;设循环指针 LP0: CLR C ;C清0 MOV A,R2 ;取16位无符号数低字节 RLC A ;低字节带进位左移 MOV R2,A ;左移结果保存在R2中 MOV A, R3 ;取16位无符号数高字节 RLC A ;高字节带进位左移 MOV R3,A ;左移结果保存在R3中 MOV A, R4 ;实现 的运算 ADDC A, R4 ;(R4)
13、+(R4)=(R4)2,带进位相加,C中为ai DA A ;十进制调整 MOV R4,A MOV A, R5 ADDC A, R5 ;(R5)+(R5)=(R5)2 DA A MOV R5,A MOV A, R6 ADDC A, R6 ;(R6)+(R6)=(R6)2 DA A MOV R6,A DJNZ R7, LP0 RET,第四章 MCS-51单片机汇编语言程序设计,(2)BCD数转换成双字节二进制数。,转换方法:因为 ,而 运算可编成子程序。,入口:R5(千位,百位)、R4(十位,个位)为BCD码。,出口:R5R4(16位无符号二进制整数)。,第四章 MCS-51单片机汇编语言程序设计
14、,程序清单: BCDB: MOV A,R5 MOV R2,A ;取千位、百位BCD码 ACALL BCDB1 ;调用子程序 MOV B,#64H MUL AB ;乘以100 MOV R6,A ;乘积低8位送R6 XCH A,B ;交换乘积高、低位 MOV R5,A ;乘积高位送R5 MOV A,R4 ;取十位、个位BCD码 MOV R2,A ;送入R2 ACALL BCDB1 ;调用子程序 ADD A,R6 ;加千位、百位乘积低8位 MOV R4,A ;送入R4 MOV A,R5 ;乘积高8位送A ADDC A,#00H ;加进位位 MOV R5,A ;存结果 HERE: SJMP HERE
15、子程序清单: BCDB1: MOV A,R2 ;取BCD码 ANL A,#0F0H ;屏蔽低4位 SWAP A MOV B,#0AH MUL AB ;高位BCD码乘以10 MOV R3,A ;乘积送R3 MOV A,R2 ;取BCD码 ANL A,#0FH ;屏蔽高4位 ADD A,R3 ;高位加低位BCD码 MOV R2,A ;送R2 RET,第四章 MCS-51单片机汇编语言程序设计,(3) 4位二进制数转换为ASCII码。,转换方法:数字09的ASCII码分别是30H39H; 英文大写字母AF的ASCII码分别是41H46H。 可见数字09的ASCII码与数字值相差30H。字母 AF的A
16、SCII码与其数值相差37H。转换过程中, 若4位二进制数小于10,则此二进制数加上30H, 若大于或等于10,则加上37H。,入口:(R2) = 4位二进制数。 出口:(R2) = 转换后的ASCII码。,程序清单: BINASC:MOV A,R2 ;取4位二进制数 ANL A,#0FH ;屏蔽高4位 CLR C CJNE A, #0AH,LP ; LP: JC LOOP ;该数10转到LOOP ADD A,#07H LOOP: ADD A,#30H MOV R2,A ;ASCII码(R2) RET,第四章 MCS-51单片机汇编语言程序设计,(4) ASCII码转换为4位二进制数。,转换方
17、法:为4位二进制数转换 为ASCII码的逆过程。,入口:(R2) = ASCII码。 出口:(R2) = 转换后的二进制数。,程序清单: ASCBIN:MOV A,R2 ;取ASCII码 CLR C SUBB A,#30H ;ASCII码减去30H MOV R2,A ;得二进制数(R2) SUBB A,#0AH MOV A, R2 ; 减30H结果A JC LOOP ;10,再减去07H LOOP: MOV R2,A ;存结果 RET,第四章 MCS-51单片机汇编语言程序设计,4.3 运算类程序,定点数的表示方法: 定点数就是小数点固定的数。它可以分为整数、小数、混合小数等。按数的正负可分为
18、无符号数和有符号数。,1、有符号数的表示方法 (1)原码表示法 (2)补码表示法,如果在一个无符号数中增加一个符号位,就可以表示数的正负。符号位为0表示该数是正数;符号位为1表示该数为负数。,引入补码后,在数的前面加一位符号位,该位为0表示正数,为1表示负数。对于正数,数值表示法不变;对于负数,采用该数的补码来表示。,4.3.1 定点数运算程序设计,第四章 MCS-51单片机汇编语言程序设计,【例4-7】双字节数取补子程序 功能:(R4R5)取补 ( R4R5) 入口:R4R5中存放被取补数 出口:取补后数仍存放在R4R5中 程序清单: CMPT: MOV A, R5 ;取低8位数 CPL A
19、 ADD A, #1 MOV R5, A ;低8位取补后送R5 MOV A, R4 ;取高8位数 CPL A ;取反 ADDC A, #0 ;加进位位 MOV R4, A ;高8位数取补后送R4 RET,第四章 MCS-51单片机汇编语言程序设计,2. 带符号数的移位,在一个采用位置表示权的数制中,数的左移和右移操作分别等于乘以和除以基数的操作。由于一般带有符号的数的最高位为符号位,故在执行算术移位操作时,必须保持最高位不变,需选择适当的数字移入空位置。以带符号的二进制数为例:,正数:由于正数的符号位为0,故左移或右移都移入0。 原码表示的负数:由于负数的符号位为1,故移位时符号不应参加移位,
20、并保证左移或右移都移入0。,第四章 MCS-51单片机汇编语言程序设计,【例4-8】双字节原码左移一位子程序。 功能:(R2R3)左移一位 ( R2R3),不改变符号位, 不考虑溢出 入口:原码双字节存放在R2R3中 出口:左移后仍存放在R2R3中 程序清单: DRL1: MOV A,R3 ;取低8位 CLR C ;清进位位 RLC A ;带进位左移 MOV R3,A ;低8位左移一位送R3 MOV A,R2 ;取高8位 RLC A ;带进位左移 MOV A.7, ;恢复符号位 MOV R2,A ;高8位左移后送R2 RET,第四章 MCS-51单片机汇编语言程序设计,【例4-9】双字节原码右
21、移一位子程序。 功能:(R2R3)右移一位 ( R2R3),不改变符号位, 不考虑溢出 入口:原码双字节存放在R2R3中 出口:右移后仍存放在R2R3中 程序清单: DRR1: MOV A, R2 ;取高8位 MOV C, A.7 ;A.7送入CY CLR A.7 ;A.7位清0 RRC A ;高8位带进位右移,恢 复符号位 MOV R2,A MOV A, R3 ;取低8位 RRC A ;低8位带进位右移一位 MOV R3,A RET,第四章 MCS-51单片机汇编语言程序设计,3、补码表示的负数:补码表示的负数的左移操作与原码相同,低位移入0。右移时,最高位应移入1。,【例4-10】双字节补
22、码右移一位子程序。 功能:(R2R3)右移一位 ( R2R3),不改变符号位 入口:双字节补码存放在R2R3中 出口:右移后仍存放在R2R3中 程序清单: CRR1: MOV A, R2 ;取高8位 MOV C, A.7 ;暂存符号位 RRC A ;高8位带进位右移,将符号 位移进A.7 MOV R2,A ;高8位移位后送R2 MOV A,R3 ;取低8位 RRC A ;低8位带进位右移 MOV R3,A ;送R3 RET,第四章 MCS-51单片机汇编语言程序设计,4.3.2 定点数加减运算,【例4-11】双字节补码加法子程序。 功能: (R2R3)+(R6R7) ( R4R5) 入口:R2
23、R3存放被加数,R6R7存放加数 出口:结果存放在R4R5中 出口时OV=1表示溢出 程序清单: NADD: MOV A,R3 ;取被加数低8位 ADD A,R7 ;与加数低8位相加 MOV R5,A ;低8位之和送入R5 MOV A,R2 ;取被加数高8位 ADDC A,R6 ;与加数高8位带进位相加 MOV R4,A ;高8位和送R4 RET,第四章 MCS-51单片机汇编语言程序设计,【例4-12】双字节补码减法子程序。 功能: (R2R3)-(R6R7) ( R4R5) 入口:R2R3存放被减数,R6R7存放减数 出口:结果存放在R4R5中 出口时OV=1表示溢出 程序清单: NADD
24、: MOV A,R3 ;取被减数低8位 CLR C ;清进位位 SUBB A,R7 ;低8位相减 MOV R5,A ;结果送R5 MOV A,R2 ;取被减数高8位 SUBB A,R6 ;高8位带借位相减 MOV R4, A ;结果送R4 RET,第四章 MCS-51单片机汇编语言程序设计,4.3.3 定点数乘法运算,用重复加法作乘法的过程可叙述如下: 清0累计积 从最低位开始检查各个乘数位。 如乘数位为1,加被乘数至累计积,否则不加。 左移一位被乘数。 重复步骤(1)(4)n次。(n为字长)。,实际用程序实现这一算法时,把乘数与结果联合组成一个双倍字长,将左移被乘数改为右移结果与乘数。一方面
25、可化简加法(只需要单字长运算),另一方面可用右移来完成乘数最低位的检查,得到的乘积为双倍字长。程序框图如图4-12所示。,1. 无符号数二进制乘法,第四章 MCS-51单片机汇编语言程序设计,第四章 MCS-51单片机汇编语言程序设计,【例4-13】采用重复相加法的双字节无符号乘法。 功能:(R2R3)(R6R7)(R4R5R6R7) 入口:R2R3中存放被乘数,R6R7中存放乘数 出口:结果存放在R4R5 R6R7中 程序框图如图4-13所示。,程序清单: NMUL: MOV R4,#0 ;R4,R5清0 MOV R5,#0 MOV R0,#16 ;16位二进制数 CLR C NMLP: M
26、OV A,R4 ;CR4R5R6R7右移一位 RRC A MOV R4,A MOV A ,R5 RRC A MOV R5,A MOV A, R6 RRC A MOV R6,A MOV A, R7,第四章 MCS-51单片机汇编语言程序设计,RRC A ;C中为移出的乘数最低位 MOV R7,A ; JNC NMLN ;C不为1,转NMLN MOV A, R5 ;C为1,(R4R5)+(R2R3) ADD A,R3 MOV R5,A MOV A,R4 ADDC A,R2 MOV R4,A NMLN: DJNZ R0,NMLP ;循环16次 MOV A, R4 ;CR4R5R6R7再右移一位 RR
27、C A 将C移入(R4).7 MOV R4,A MOV A, R5 RRC A MOV R5,A MOV A, R6 RRC A MOV R6,A MOV A, R7 RRC A MOV R7,A RET,第四章 MCS-51单片机汇编语言程序设计,2. 有符号数二进制乘法,(1)原码乘法 对原码表示的带符号二进制数,按正数与正数相乘为正,正数与负数相乘为负,负数与负数相乘为正的原则,得出积的符号(计算机中可用异或操作得出积的符号),然后清0符号位,执行不带符号位的乘法,最后送积的符号。,设被乘数A的符号为A0,数值为A,乘数B的符号位为B0,数值为B,积C的符号位为C0,数值为C,这个算法可
28、用图4-14来表示(图中F0为符号暂存位)。,第四章 MCS-51单片机汇编语言程序设计,【例4-14】原码有符号数双字节乘法。 功能:(R2R3)(R6R7)(R4R5R6R7) 入口:R2R3中存放被乘数,R6R7中存放乘数 出口:积存放在R4R5 R6R7中 说明:所有操作数均为原码,符号位在最高位。 本程序调用例4-13的无符号双字节乘法子程序。 程序清单: MULT: MOV A,R2 ;取被乘数高8位 XRL A,R6 ;与乘数高8位异或 MOV ,.7 ;暂存符号位 MOV F0,C MOV A,R2 ;取被乘数高8位 CLR . ;清符号位后送回R2 MOV R2,A MOV
29、A,R6 ;取乘数高8位 CLR . ;清符号位后送回R6 MOV R6,A ACALL NMUL ;调用无符号乘法 MOV A,R4 ;取乘积的高8位 MOV ,0 ;送积的符号 MOV .,C MOV R4,A RET,第四章 MCS-51单片机汇编语言程序设计,(2)补码乘法,采取先变成原码,然后执行乘法,再由符号标志确定乘积符号的方法。,第四章 MCS-51单片机汇编语言程序设计,3. MCS-51快速乘法,MCS-51快速乘法有一条乘法指令:MUL AB。它执行(A)(B)BA。它进行的是单字节乘以单字节,积为双字节的运算。由于单字节运算不能满足实际需要,故必需把它扩展为双字节的乘法
30、。扩展时可按照以字节为单位的竖式乘法来编程序。,【例4-15】无符号双字节快速乘法。 功能:(R2R3)(R6R7)(R4R5R6R7) 入口:R2R3中存放被乘数,R6R7中存放乘数 出口:积存放在R4R5 R6R7中 计算及原理如下式: 【R2】 【R3】 【R6】 【R7】 【R3R7】H 【R3R7】L 【R2R7】H 【R2R7】L 【R3R6】H 【R3R6】L 【R2R6】H 【R2R6】L 【R4】 【R5】 【R6】 【R7】,第四章 MCS-51单片机汇编语言程序设计,4.3.4 定点数除法运算,1.无符号二进制数除法,图4-16 比较除法流程图,手算除法步骤,第四章 MC
31、S-51单片机汇编语言程序设计,【例4-16】采用比较的无符号双字节除法。 功能: (R2R3R4R5)(R6R7)(R4R5) 余数为(R2R3) 入口:R2R3R4R5中存放 被除数,R6R7中 存放除数。 出口:商存放在R4R5, 余数存放在R2R3 中。,第四章 MCS-51单片机汇编语言程序设计,2.带符号二进制除法 (1)原码除法:原码除法在除法前,先求出商的符号,然后清零符号位,执行不带符号的除法,最后送商的符号。,【例4-17】原码带符号双字节除法。 功能:(R2R3R4R5)(R6R7)(R4R5) 入口: R2R3R4R5中存放被除数,R6R7中存放除数。 出口: 商存放在
32、R4R5中,余数存放在R2R3中,若溢 出则 F0=1 说明: 操作数均以原码表示,符号位在最高位。,(2)补码除法: 对于补码表示的符号二进制数的除法,可像补码乘法一样,采用先对负数取补,然后再执行除法。,第四章 MCS-51单片机汇编语言程序设计,4.3.5 数据极值查找,数据极值查找就是在指定的数据区中找出最大值或最小值。,【例4-18】 已知内部RAM ADRR为起始地址的数据块内数据是无符号数,数据块长为LEN,找出数据块中最大值并存入MAX单元。 入口: R0(数据首地址指针)。 LEN(长度)。 出口: MAX(最大值MAX单元)。 程序清单: ORG 2000H LEN DAT
33、A 40H MAX DATA 30H MOV MAX,#00H ;MAX清0 MOV R0,#ADDR ;数据起始地址 LOOP: MOV A,R0 ;数据块中某数送A CJNE A,MAX,NEXT1 ;A与MAX比较 NEXT1:JC NEXT2 ;若AMAX,则转NEXT2 MOV MAX,A ;若AMAX,则大数送 MAX NEXT2:INC R0 ;修改数据块指针 DJNZ LEN,LOOP ;未完,转LOOP RET ;返回,第四章 MCS-51单片机汇编语言程序设计,4.3.6 数据排序,数据排序就是使数据区中的数据从小到大排列(升序),或数据从大到小排列(降序),最常用的是冒泡
34、法。,介绍:冒泡法是一种相邻数互换的排序方法,又称两两比较法执行时从前向后进行相邻数比较,如数据的大小次序与要求顺序不符时(逆序),就将两个数互换,否则不互换。为进行升序排序,应通过这种相邻数互换方法,使小的数向前移,大数向后移。如此从前向后进行一次冒泡(相邻数互换),就会把最大数换到最后;再进行一冒泡,就会把次大数排在倒数第二的位置;以此类推,对于n个数,理论上说应进行(n-1)次冒泡才能完成排序。但实际上有时不到(n-1)次就已排好顺序。判定排序是否完成最简单的方法是看各次冒泡中是否有互换发生,如果有数据互换,说明排序还没完成;否则就表示已排好序。为此控制排序结束一般用设置互换标志的方法,
35、以其状态表示在一次冒泡中有无数据互换进行。,第四章 MCS-51单片机汇编语言程序设计,【例4-19】 假定8个数连续存放在20H为首地址的内部RAM中,使用冒泡法进行升序排序编程。(单字节无符号数) 设R7为比较次数计数器,初始值为07H,用户标志位F0为冒泡过程中是否有数据互换的状态标志,F0=0表示无互换发生,F0=1表示有互换发生。 入口:R0(数据区首地址指针)。 R7(比较次数)。 出口:F0作为发生互换的标志, 当无互换时,排序结束。,第四章 MCS-51单片机汇编语言程序设计,图4-18 排序流程图,程序清单如下: SORT: MOV R0,#20H ;数据首地址 MOV R7
36、,#07H ;比较次数 CLR F0 ;互换标志清0 LOOP: MOV A,R0 ;取前一个数 MOV 2BH,A ;存前一个数 INC R0 MOV 2AH,R0 ;取后一个数 CLR C ;清CY SUBB A,R0 ;前数减后数 JC NEXT MOV R0,2BH DEC R0 MOV R0,2AH ;两个数交换位置 INC R0 ;准备下一次比较 SETB F0 ;互换标志置位 NEXT:DJNZ R7,LOOP ;下个数比较? JB F0,SORT ;下一轮比较? RET,第四章 MCS-51单片机汇编语言程序设计,本章小结,在进行程序设计时,必须根据实际问题和单片机的特点来确定
37、算法,然后按照尽可能使程序简短、节省数据存放单元和缩短运算时间3个原则来编写程序。 汇编语言程序具有四种基本结构形式,顺序结构程序是一种最简单、最基本的程序,特点是按程序编写的顺序依次执行,程序流向不变。编写时应注意正确选择指令,提高程序的执行效率;分支结构程序可以根据程序要求无条件或有条件地改变程序的执行顺序,选择程序流向。编写分支结构程序主要在于正确使用转移指令;需多次重复执行某段程序时,可把这段程序设计为循环结构程序。这种结构可大大缩短程序,提高程序质量;为了使子程序有定的通用性,子程序中的操作对象应尽量用地址或寄存器形式,而不用立即数形式。子程序中如含有转移指令,应尽量用相对转移指令,以便它不管放在哪个区域,都能正确执行。代码转换和定点运算子程序是程序设计中经常用到的子程序。使用子程序可以使整个程序的结构清楚,阅读理解方便,节省程序存储空间。 MCS-51指令系统中,有单字节加、减、乘、除算术运算指令,这为四则运算编程带来了较大方便。但实际应用中仅有单字节的运算是不够的,还常常用到双字节及多字节的加、减、乘、除运算程序。 掌握程序设计的基本方法和这些常用的子程序可以更好地进行程序设计。,
链接地址:https://www.31doc.com/p-5030220.html