《《单片机原理及应用》第五章汇编语言程序设计.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)程序的兼容性、可扩展性。(5)程序的可靠性。,5-2
2、 顺序程序 直线程序又称简单程序,程序走向只有一条路径。例1 双字节变补程序(设数据在R4 R5中)双字节变补程序(设数据在R4R5中):MOV A,R5;取低字节CPL AADD A,#1;低字节变补MOV R5,AMOV A,R4;取高字节CPL AADDC A,#0;高字节变补MOV R4,A,第五章 汇编语言程序设计,第五章 汇编语言程序设计,例2 压缩式BCD码分解成为单字节BCD码。,MOV R0,#40H;设指针MOV A,R0;取一个字节MOV R2,A;暂存ANL A,#0FH;清0高半字节INC R0MOV R0,A;保存数据个位MOV A,R2SWAP A;十位换到低半字
3、节ANL A,#0FHINC R0MOV 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;存和数高字节 MOV A,#0 ADDC A,#0;加进位位 MOV R2,A;存和数进位位 SJMP$;原地踏步 END,第五章 汇编
4、语言程序设计,5-3 分支程序 由条件转移指令构成程序判断框部分,形成程序分支结构。5-3-1单重分支程序 一个判断决策框,程序有两条出路。两种分支结构。例1 求R2中补码绝对值,正数不变,负数变补。MOV A,R2 JNB ACC.7,NEXT;为正数?CPL A;负数变补 INC A MOV R2,ANEXT:SJMP NEXT;结束,第五章 汇编语言程序设计,5-3-2 多重分支程序多次使用条件转移指令,形成两个以上判断框。例5-7 设30H单元存放的是一元二次方程ax2+bx+c=0根的判别式=b2-4ac的值。解:值为有符号数,有三种情况,即大于零、等于零、小于零。,第五章 汇编语言
5、程序设计,编程:ORG 1000HSTART:MOV A,30H;值送A JNB ACC.7,YES;=0转YES MOV 31H,#0;0转TOW MOV 31H,#1;=0有相同实根 SJMP FINISHTOW:MOV 31H,#2;有两个不同实根FINISH:SJMP$,第五章 汇编语言程序设计,5-3-3 N路分支程序 N路分支程序是根据前面程序运行的结果,可以有N种选择,并能转向其中任一处理程序。,第五章 汇编语言程序设计,例5-10 128路分支程序。功能:根据R3的值(00H7FH)转到128个目的地址。参考程序:JMPl28:MOV A,R3 RL A;(A)2 MOV DP
6、TR,#PRGTBL;散转表首址送DPTR JMP A+DPTR;散转PRGTBL:AJMP ROUT00 AJMP ROUT01 AJMP ROUT7F;128个AJMP指令占256个字节,第五章 汇编语言程序设计,例5-11 256路分支程序 功能:根据R3的值转移到256个目的地址;入口条件:(R3)=转移目的地址代号(00HFFH);出口条件:转移到相应分支处理程序入口。解:JMP256:MOV A,R3;取N值 MOV DPTR,#PRGTBL;指向分支地址表首址 CLR C RLC A;(A)2 JNC LOWl28;是前128个分支程序,则转移 INC DPH;否则基址加256,
7、第五章 汇编语言程序设计,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:DW ROUT00;占用512个字节 DW ROUT01,第五章 汇编语言程序设计,例5-12 大于256路分支转移程序 功能:根据入口条件转向n个分支处理程序 入口条件:(R7R6)=转移目的地址代号;出口条件:转移到相应分支处理程序入
8、口。程序散转表中有N条LJMP指令,每条LJMP指令占3个字节,因此要按入口条件将址代号乘以3,用乘积的高字节加DPH,乘积的低字节送A(变址寄存器)。PRGTBL:LJMP ROUT0 LJMP ROUT1 LJMP ROUT2,第五章 汇编语言程序设计,参考程序:JMPN:MOV DPTR,#PRGTBL;DPTR指向表首址MOV A,R7;取地址代号高8位MOV B,#3;MUL AB;3ADD A,DPH;MOV DPH,A;修改指针高8位MOV A,R6;取地址代号低8位MOV B,#3;3MUL AB;XCH A,B;交换乘积的高低字节ADD A,DPH;乘积的高字节加DPHMOV
9、 DPH,AXCH A,B;乘积的低字节送AJMP A+DPTR;散转,第五章 汇编语言程序设计,5-4 循环程序包含多次重复执行的程序段,循环结构使程序紧凑。5-4-1循环程序的导出各个环节任务:一初始化部分循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。二循环体循环工作部分:需多次重复处理的工作。循环控制部分:1.修改指针和循环控制变量。2.检测循环条件:满足循环条件,继续循环,否则退出循环。三.结束部分 处理和保存循环结果。1)已知循环次数 2)循环次数未知允许0次循环的循环结构:在循环工作之前检测循环条件。,第五章 汇编语言程序设计,单重循环简单循环结构:循环体中不套循环。
10、例:求n个单字节数据的累加,设数据串已在43H起始单元,数据串长度在42H单元,累加和不超过2个字节。SUM:MOVR0,#42H;设指针MOVA,R0MOVR2,A;循环计数器R2nCLRA;结果单元清0MOVR3,AADD1:INCR0;修改指针 ADDA,R0;累加 JNC NEXT;处理进位 INCR3;有进位,高字节加1NEXT:DJNZ R2,ADD1;循环控制:数据是否加完?MOV40H,A;循环结束,保存结果 MOV41H,R3 RET,第五章 汇编语言程序设计,循环控制方法:计数控制、特征标志控制。一.计数控制:设循环计数器,控制循环次数。正计数和倒计数两种方式。例:为一串7
11、位ASCII码数据的D7位加上奇校验,设数据存放在片外RAM的2101H起始单元,数据长度在2100H单元。MOV DPTR,#2100HMOVX A,DPTRMOV R2,ANEXT:INC DPTRMOVX A,DPTRORL A,#80HJNB P,PASS;判断是否加校验MOVX DPTR,A;是,则加奇校验PASS:DJNZ R2,NEXTDONE:SJMP DONE,第五章 汇编语言程序设计,二.特征控制:设定循环结束标志实现循环控制。例:找正数表最小值。正数表存在片外RAM中以LIST为起始单元,用-1作为结束标志。START:MOVDPTR,#LIST;数表首地址 MOVB,#
12、127;预置最小值NEXT:MOVX A,DPTR;取数 INCDPTR;修改指针 CJNE A,#0FFH,NEXT1;是否为数表结尾?SJMP DONE;循环结束NEXT1:CJNE A,B,NEXT2;比较NEXT2:JNCNEXT;Cy=1,则AB MOVB,A;保存较小值 SJMP NEXTDONE:SJMP DONE,第五章 汇编语言程序设计,5-4-2 多重循环循环体中套循环结构。以双重循环使用较多。例:将内存一串单字节无符号数升序排序。步骤:每次取相邻单元的两个数比较,决定是否需要交换数据位置。第一次循环,比较N-1次,取数据表中最大值。第二次循环,比较N-2次,取到次大值。第
13、N-1次循环:比较一次,排序结束。,第五章 汇编语言程序设计,SORT:MOV A,#N-1;N个数据排序 MOV R4,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,AUNEX:DJNZ R3,LOOP2;内循环结束?DJNZ R4,LOOP1;外循环结束?RET,第五章 汇编语言程序设计,软件延时程序 用循
14、环程序将指令重复多次执行,实现软件延时。试计算延时程序的执行时间。源程序指令周期(M)指令执行次数DELAY:MOV R6,#64H1 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,11001002551001,第五章 汇编语言程序设计,编写循环程序应注意的问题 1)循环体前应注意安排循环初始化;2)内外循环间不应相互交叉。,第五章 汇编语言程序设计,5-5 查表程序例5-19 一个十六进制数存放在HEX单元的低四位,将其转
15、换成ASCII码并送回HEX单元。编程:ORG 0100H HEX EQU 30HHEXASC:MOV A,HEX ANL A,#00001111B ADD A,#3;变址调整 MOVC A,A+PC MOV HEX,A;2字节 RET;1字节ASCTAB:DB30H,3lH,32H,33H DB34H,35H,36H,37H DB38H,39H,41H,42H DB43H,44H,45H,46H END,第五章 汇编语言程序设计,5-6 子程序设计子程序:能完成某项特定功能的独立程序段,可被反复调用。优点:(1)不必重复书写同样的程序,提高编程效率;(2)程序的逻辑结构简单,便于阅读;(3)
16、缩短了源程序和目标程序的长度,节省了程序存储器空间;(4)使程序模块化、通用化,便于交流,共享资源;(5)便于按某种功能调试。,第五章 汇编语言程序设计,1.子程序结构一子程序入口用标号作为子程序名。二调用子程序之前设置好堆栈。三用返回指令RET结束子程序,并保证堆栈栈顶为调 用程序的返回地址。四.子程序嵌套须考虑堆栈容量。五.提供足够的调用信息:如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。,第五章 汇编语言程序设计,2.参数传递入口参数:调用子程序之前,需要传给子程序的参数。出口参数:子程序送回调用程序的结果参数。(1)子程序无须传递参数,
17、第五章 汇编语言程序设计,(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 ADD A,#1 MOVR0,A NEXT:I
18、NC 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;取被转换数 LCALLHASC;转子*PC POP ASC;ASCLASC MOV A,HEX;取被转换数 SWAP A;处理高四位 PUSH ACC LCALL HASC;转子程序 POP ASC+1;ASCH ASC+1,第五章 汇编语言程序设计,子
19、程序:HASC:DEC SP DEC SP;修改SP指向HEX POPACC;弹出HEX ANL A,#0FH;屏蔽高四位 ADD A,#5;变址调整 MOVCA,A+PC;查表 PUSHACC;结果入栈(2字节)INCSP;(1字节)INCSP;修改SP指向断点位置(1字节)RET;(1字节)ASCTAB:DB 0 1 2.7 DB 8 9 A.F,第五章 汇编语言程序设计,3.现场保护推入与弹出的顺序应按“先进后出”,或“后进先出”的顺序,才能保证现场的恢复。例:十翻二子程序的现场保护。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子程序嵌套,断点入栈,断点出栈,
链接地址:https://www.31ppt.com/p-6526610.html