《单片机原理及应用》第五章汇编语言程序设计.ppt

上传人:本田雅阁 文档编号:3473553 上传时间:2019-08-31 格式:PPT 页数:35 大小:2.62MB
返回 下载 相关 举报
《单片机原理及应用》第五章汇编语言程序设计.ppt_第1页
第1页 / 共35页
《单片机原理及应用》第五章汇编语言程序设计.ppt_第2页
第2页 / 共35页
《单片机原理及应用》第五章汇编语言程序设计.ppt_第3页
第3页 / 共35页
《单片机原理及应用》第五章汇编语言程序设计.ppt_第4页
第4页 / 共35页
《单片机原理及应用》第五章汇编语言程序设计.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《《单片机原理及应用》第五章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《《单片机原理及应用》第五章汇编语言程序设计.ppt(35页珍藏版)》请在三一文库上搜索。

1、第五章 汇编 语言程序设计,1 程序设计方法 2 顺序程序 3 分支程序 4 循环程序 5 子程序 6 算术运算程序,第五章 汇编语言程序设计,5-1-2 汇编语言程序设计步骤 一.分析问题。 二.确定算法。 三.制定程序流程图:表示程序结构和程序功能 四.编制源程序 1. 合理分配存储器单元和了解I/O接口地址。 2. 按功能设计程序, 明确各程序之间的相互关系。 3. 用注释行说明程序, 便于阅读和修改调试和修改。 五.程序调试。,第五章 汇编语言程序设计,5-1-3 评价程序质量的标准 (1)程序的执行时间。 (2)程序所占用的内存字节数。 (3)程序的逻辑性、可读性。 (4)程序的兼容

2、性、可扩展性。 (5)程序的可靠性。,5-2 顺序程序 直线程序又称简单程序,程序走向只有一条路径。 例1 双字节变补程序(设数据在R4 R5中)双字节变补程序(设数据在R4R5中): MOV A,R5 ;取低字节 CPL A ADD A,#1 ;低字节变补 MOV R5,A MOV A,R4 ;取高字节 CPL A ADDC A,#0 ;高字节变补 MOV R4,A,第五章 汇编语言程序设计,第五章 汇编语言程序设计,例2 压缩式BCD码分解成为单字节BCD码。,MOV R0,#40H ;设指针 MOV A,R0 ;取一个字节 MOV R2,A ;暂存 ANL A,#0FH ;清0高半字节

3、INC R0 MOV R0,A ;保存数据个位 MOV A,R2 SWAP A ;十位换到低半字节 ANL A,#0FH INC R0 MOV R0,A ;保存数据十位,十 个,第五章 汇编语言程序设计,例5-1 假设两个双字节无符号数,分别存放在R1R0和R3R2中,高字节在前,低字节在后。编程使两数相加,和数存放回R2R1R0中。 ORG 1000h CLR C MOV A,R0 ;取被加数低字节至A ADD A,R2 ;与加数低字节相加 MOV R0,A ;存和数低字节 MOV A,Rl ;取被加数高字节至A ADDC A,R3 ;与加数高字节相加 MOV Rl,A ;存和数高字节 MO

4、V A,#0 ADDC A,#0 ;加进位位 MOV R2,A ;存和数进位位 SJMP $ ;原地踏步 END,第五章 汇编语言程序设计,5-3 分支程序 由条件转移指令构成程序判断框部分,形成程序分支结构。 5-3-1 单重分支程序 一个判断决策框,程序有两条出路。两种分支结构。 例1 求R2中补码绝对值,正数不变,负数变补。 MOV A,R2 JNB ACC.7,NEXT ;为正数? CPL A ;负数变补 INC A MOV R2,A NEXT: SJMP NEXT ;结束,第五章 汇编语言程序设计,5-3-2 多重分支程序 多次使用条件转移指令,形成两个以上判断框。 例5-7 设30

5、H单元存放的是一元二次方程ax2+bx+c=0根的判别式=b2-4ac的值。 解:值为有符号数,有三种情况,即大于零、等于零、小于零。,第五章 汇编语言程序设计,编程: ORG 1000H START: MOV A,30H ;值送A JNB ACC.7,YES ;=0转YES MOV 31H,#0 ;0转TOW MOV 31H,#1 ;=0有相同实根 SJMP FINISH TOW: MOV 31H,#2 ;有两个不同实根 FINISH:SJMP $,第五章 汇编语言程序设计,5-3-3 N路分支程序 N路分支程序是根据前面程序运行的结果,可以有N种选择,并能转向其中任一处理程序。,第五章 汇

6、编语言程序设计,例5-10 128路分支程序。 功能:根据R3的值(00H7FH)转到128个目的地址。 参考程序: JMPl28: MOV A,R3 RL A ;(A)2 MOV DPTR,#PRGTBL ;散转表首址送DPTR JMP A+DPTR ;散转 PRGTBL:AJMP ROUT00 AJMP ROUT01 AJMP ROUT7F ;128个AJMP指令占256个字节,第五章 汇编语言程序设计,例5-11 256路分支程序 功能:根据R3的值转移到256个目的地址; 入口条件:(R3)=转移目的地址代号(00HFFH); 出口条件:转移到相应分支处理程序入口。 解: JMP256

7、: MOV A,R3 ;取N值 MOV DPTR,#PRGTBL ;指向分支地址表首址 CLR C RLC A ;(A)2 JNC LOWl28 ;是前128个分支程序,则转移 INC DPH ;否则基址加256,第五章 汇编语言程序设计,LOWl28: MOV TEMP,A ;暂存A INC A ;指向地址低8位 MOVC A,A+DPTR ;查表,读分支地址低8位 PUSH ACC ;地址低8位入栈 MOV A,TEMP ;恢复A,指向地址高8位 MOVC A,A+DPTR ;查表,读分支地址高8位 PUSH ACC ;地址高8位入栈 RET ;分支地址弹入PC实现转移 PRGTBL: D

8、W ROUT00 ;占用512个字节 DW ROUT01 ,第五章 汇编语言程序设计,例5-12 大于256路分支转移程序 功能:根据入口条件转向n个分支处理程序 入口条件:(R7R6)=转移目的地址代号; 出口条件:转移到相应分支处理程序入口。 程序散转表中有N条LJMP指令,每条LJMP指令占3个字节,因此要按入口条件将址代号乘以3,用乘积的高字节加DPH,乘积的低字节送A(变址寄存器)。 PRGTBL:LJMP ROUT0 LJMP ROUT1 LJMP ROUT2 ,第五章 汇编语言程序设计,参考程序: JMPN:MOV DPTR,#PRGTBL;DPTR指向表首址 MOV A,R7

9、;取地址代号高8位 MOV B,#3 ; MUL AB ;3 ADD A,DPH ; MOV DPH,A ;修改指针高8位 MOV A,R6 ;取地址代号低8位 MOV B,#3 ;3 MUL AB ; XCH A,B ;交换乘积的高低字节 ADD A,DPH ;乘积的高字节加DPH MOV DPH,A XCH A,B ;乘积的低字节送A JMP A+DPTR ;散转,第五章 汇编语言程序设计,5-4 循环程序 包含多次重复执行的程序段,循环结构使程序紧凑。 5-4-1 循环程序的导出 各个环节任务: 一初始化部分 循环准备工作。 如:清结果单元、设指针、设循环控制变量初值等。 二循环体 循环

10、工作部分: 需多次重复处理的工作。 循环控制部分: 1.修改指针和循环控制变量。 2.检测循环条件:满足循环条件,继续循环,否则退出循环。 三.结束部分 处理和保存循环结果。1)已知循环次数 2)循环次数未知 允许0次循环的循环结构:在循环工作之前检测循环条件。,第五章 汇编语言程序设计,单重循环 简单循环结构:循环体中不套循环。 例:求n个单字节数据的累加,设数据串已在43H起始单元,数据串长度在42H单元,累加和不超过2个字节。 SUM:MOV R0,#42H;设指针 MOV A,R0 MOV R2,A ;循环计数器R2n CLR A ;结果单元清0 MOV R3,A ADD1:INC R

11、0 ;修改指针 ADD A,R0 ;累加 JNC NEXT ;处理进位 INC R3 ;有进位,高字节加1 NEXT: DJNZ R2,ADD1 ;循环控制:数据是否加完? MOV 40H,A ;循环结束,保存结果 MOV 41H,R3 RET,第五章 汇编语言程序设计,循环控制方法:计数控制、特征标志控制。 一.计数控制: 设循环计数器,控制循环次数。正计数和倒计数两种方式。 例:为一串7位ASCII码数据的D7位加上奇校验,设数据存放在片外RAM的2101H起始单元,数据长度在2100H单元。 MOV DPTR,#2100H MOVX A,DPTR MOV R2,A NEXT:INC DP

12、TR MOVX A,DPTR ORL A,#80H JNB P,PASS ;判断是否加校验 MOVX DPTR,A;是,则加奇校验 PASS:DJNZ R2,NEXT DONE:SJMP DONE,第五章 汇编语言程序设计,二.特征控制: 设定循环结束标志实现循环控制。 例:找正数表最小值。正数表存在片外RAM中以LIST为起始单元,用-1作为结束标志。 START:MOV DPTR,#LIST ;数表首地址 MOV B,#127 ;预置最小值 NEXT: MOVX A,DPTR ;取数 INC DPTR ;修改指针 CJNE A,#0FFH,NEXT1;是否为数表结尾? SJMP DONE

13、;循环结束 NEXT1:CJNE A,B,NEXT2 ;比较 NEXT2:JNC NEXT ;Cy=1,则AB MOV B,A ;保存较小值 SJMP NEXT DONE: SJMP DONE,第五章 汇编语言程序设计,5-4-2 多重循环 循环体中套循环结构。以双重循环使用较多。 例:将内存一串单字节无符号数升序排序。 步骤: 每次取相邻单元的两个数比较, 决定是否需要交换数据位置。 第一次循环,比较N-1次,取数据表中最大值。 第二次循环,比较N-2次,取到次大值。 第N-1次循环:比较一次,排序结束。,第五章 汇编语言程序设计,SORT: MOV A,#N-1 ;N个数据排序 MOV R

14、4,A ;外循环次数 LOOP1:MOV A,R4 MOV R3,A ;内循环次数 MOV R0,#TAB ;设数据指针 LOOP2:MOV A,R0 ;取二数 MOV B,A INC R0 MOV A,R0 CJNE A,B,L1 ;比较 L1: JNC UNEX ;AB,不交换 DEC R0 ;否则交换数据 XCH A ,R0 INC R0 MOV R0,A UNEX: DJNZ R3,LOOP2 ;内循环结束? DJNZ R4,LOOP1 ;外循环结束? RET,第五章 汇编语言程序设计,软件延时程序 用循环程序将指令重复多次执行,实现软件延时。 试计算延时程序的执行时间。 源程序 指令

15、周期(M) 指令执行次数 DELAY:MOV R6,#64H 1 I1: MOV R7,#0FFH 1 I2: DJNZ R7,I2 2 DJNZ R6,I1 2 RET 2,延时时间计算:(设时钟f=12MHz) t=(11+1100+2100255+2100+21)M=51.3 ms,1 100 100255 100 1,第五章 汇编语言程序设计,5.5.2编写循环程序应注意的问题 1)循环体前应注意安排循环初始化; 2)内外循环间不应相互交叉。,第五章 汇编语言程序设计,5-5 查表程序 例5-19 一个十六进制数存放在HEX单元的低四位,将其转换成ASCII码并送回HEX单元。 编程:

16、 ORG 0100H HEX EQU 30H HEXASC: MOV A, HEX ANL A ,#00001111B ADD A, #3 ;变址调整 MOVC A, A+PC MOV HEX,A ;2字节 RET ;1字节 ASCTAB: DB 30H,3lH,32H,33H DB 34H,35H,36H,37H DB 38H,39H,41H,42H DB 43H,44H,45H,46H END,第五章 汇编语言程序设计,5-6 子程序设计 子程序:能完成某项特定功能的独立程序段,可被反复调用。 优点: (1)不必重复书写同样的程序,提高编程效率; (2)程序的逻辑结构简单,便于阅读; (3

17、)缩短了源程序和目标程序的长度,节省了程序存储器空间; (4)使程序模块化、通用化,便于交流,共享资源; (5)便于按某种功能调试。,第五章 汇编语言程序设计,1. 子程序结构 一子程序入口用标号作为子程序名。 二调用子程序之前设置好堆栈。 三用返回指令RET结束子程序,并保证堆栈栈顶为调 用程序的返回地址。 四. 子程序嵌套须考虑堆栈容量。 五. 提供足够的调用信息: 如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。,第五章 汇编语言程序设计,2. 参数传递 入口参数:调用子程序之前,需要传给子程序的参数。 出口参数:子程序送回调用程序的结果参

18、数。 (1)子程序无须传递参数,第五章 汇编语言程序设计,(2)用累加器和工作寄存器传递参数 例5-24 双字节求补子程序CPLD。 解 入口参数:(R7R6)=16位数 出口参数:(R7R6)=求补后的16位数 CPLD:MOV A,R6 CPL A ADD A,#1 MOV R6,A MOV A,R7 CPL A ADDC A,#0 MOV R7,A RET,第五章 汇编语言程序设计,(3)通过操作数地址传递参数 例5-25 n字节求补子程序。 解 入口参数:(R0)=求补数低字节指针,(R7)=n-1 出口参数:(R0)=求补后的高字节指针 CPLN: MOV A,R0 CPL A AD

19、D A,#1 MOV R0,A NEXT: INC R0 MOV A,R0 CPL A ADDC A,#0 MOV R0,A DJNZ R7,NEXT RET,第五章 汇编语言程序设计,(4)通过堆栈传递参数 例5-26 在HEX单元存放两个十六进制数,将它们分别转换 成ASC码并存入ASC和ASC+1单元。 解 由于要进行两次转换,故可调用查表子程序完成。 主程序: MAIN: PUSH HEX ;取被转换数 LCALL HASC ;转子 *PC POP ASC ;ASCLASC MOV A,HEX ;取被转换数 SWAP A ;处理高四位 PUSH ACC LCALL HASC ;转子程序

20、 POP ASC+1 ;ASCH ASC+1 ,第五章 汇编语言程序设计,子程序: HASC: DEC SP DEC SP ;修改SP指向HEX POP ACC ;弹出HEX ANL A,#0FH ;屏蔽高四位 ADD A,#5 ;变址调整 MOVC A,A+PC ;查表 PUSH ACC ;结果入栈 (2字节) INC SP ; (1字节) INC SP ;修改SP指向断点位置(1字节) RET ; (1字节) ASCTAB:DB 0 1 2 .7 DB 8 9 A .F ,第五章 汇编语言程序设计,3. 现场保护 推入与弹出的顺序应按“先进后出”,或“后进先出”的顺序,才能保证现场的恢复。

21、 例:十翻二子程序的现场保护。 BCDCB: PUSH ACC PUSH PSW PUSH DPL ;保护现场 PUSH DPH POP DPH POP DPL POP PSW ;恢复现场 POP ACC RET,第五章 汇编语言程序设计,4. 设置堆栈 调用子程序时,主程序的断点将自动入栈; 转子后,现场的保护都要占用堆栈工作单元,尤其多重转子或子 程序嵌套,需要使栈区有一定的深度。 由于MCS-51的堆栈是由Sp指针组织的内部RAM区,仅有128个 地址空间,堆栈并非越深越好,深度要恰当。,第五章 汇编语言程序设计,5.6.3 子程序的调用及嵌套 1子程序调用 2子程序嵌套,第五章 汇编语言程序设计,2子程序嵌套,断点入栈,断点出栈,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1