您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 《单片机原理及应用》第五章 汇编语言程序设计
1第五章汇编语言程序设计1程序设计方法2顺序程序3分支程序4循环程序5子程序6算术运算程序2第五章汇编语言程序设计5-1-2汇编语言程序设计步骤一.分析问题。二.确定算法。三.制定程序流程图:表示程序结构和程序功能四.编制源程序1.合理分配存储器单元和了解I/O接口地址。2.按功能设计程序,明确各程序之间的相互关系。3.用注释行说明程序,便于阅读和修改调试和修改。五.程序调试。开始1YN?3第五章汇编语言程序设计5-1-3评价程序质量的标准(1)程序的执行时间。(2)程序所占用的内存字节数。(3)程序的逻辑性、可读性。(4)程序的兼容性、可扩展性。(5)程序的可靠性。45-2顺序程序直线程序又称简单程序,程序走向只有一条路径。例1双字节变补程序(设数据在R4R5中)双字节变补程序(设数据在R4R5中):MOVA,R5;取低字节CPLAADDA,#1;低字节变补MOVR5,AMOVA,R4;取高字节CPLAADDCA,#0;高字节变补MOVR4,A第五章汇编语言程序设计5第五章汇编语言程序设计例2压缩式BCD码分解成为单字节BCD码。片内RAM42H0十41H0个40HMOVR0,#40H;设指针MOVA,@R0;取一个字节MOVR2,A;暂存ANLA,#0FH;清0高半字节INCR0MOV@R0,A;保存数据个位MOVA,R2SWAPA;十位换到低半字节ANLA,#0FHINCR0MOV@R0,A;保存数据十位十个6第五章汇编语言程序设计例5-1假设两个双字节无符号数,分别存放在R1R0和R3R2中,高字节在前,低字节在后。编程使两数相加,和数存放回R2R1R0中。ORG1000hCLRCMOVA,R0;取被加数低字节至AADDA,R2;与加数低字节相加MOVR0,A;存和数低字节MOVA,Rl;取被加数高字节至AADDCA,R3;与加数高字节相加MOVRl,A;存和数高字节MOVA,#0ADDCA,#0;加进位位MOVR2,A;存和数进位位SJMP$;原地踏步END7条件满足?N影响条件处理段YN第五章汇编语言程序设计5-3分支程序由条件转移指令构成程序判断框部分,形成程序分支结构。5-3-1单重分支程序一个判断决策框,程序有两条出路。两种分支结构。例1求R2中补码绝对值,正数不变,负数变补。MOVA,R2JNBACC.7,NEXT;为正数?CPLA;负数变补INCAMOVR2,ANEXT:SJMPNEXT;结束8第五章汇编语言程序设计5-3-2多重分支程序多次使用条件转移指令,形成两个以上判断框。例5-7设30H单元存放的是一元二次方程ax2+bx+c=0根的判别式△=b2-4ac的值。解:△值为有符号数,有三种情况,即大于零、等于零、小于零。9第五章汇编语言程序设计编程:ORG1000HSTART:MOVA,30H;△值送AJNBACC.7,YES;△=0转YESMOV31H,#0;△0,无实根SJMPFINISHYES:JNZTOW;△0转TOWMOV31H,#1;△=0有相同实根SJMPFINISHTOW:MOV31H,#2;有两个不同实根FINISH:SJMP$10第五章汇编语言程序设计5-3-3N路分支程序N路分支程序是根据前面程序运行的结果,可以有N种选择,并能转向其中任一处理程序。(R3=0?)(R3=1?)(R3=2?)PRG0PRG1PRG2YYYNNN11第五章汇编语言程序设计例5-10128路分支程序。功能:根据R3的值(00H~7FH)转到128个目的地址。参考程序:JMPl28:MOVA,R3RLA;(A)×2MOVDPTR,#PRGTBL;散转表首址送DPTRJMP@A+DPTR;散转PRGTBL:AJMPROUT00AJMPROUT01…AJMPROUT7F;128个AJMP指令占256个字节12第五章汇编语言程序设计例5-11256路分支程序功能:根据R3的值转移到256个目的地址;入口条件:(R3)=转移目的地址代号(00H~FFH);出口条件:转移到相应分支处理程序入口。解:JMP256:MOVA,R3;取N值MOVDPTR,#PRGTBL;指向分支地址表首址CLRCRLCA;(A)×2JNCLOWl28;是前128个分支程序,则转移INCDPH;否则基址加25613第五章汇编语言程序设计LOWl28:MOVTEMP,A;暂存AINCA;指向地址低8位MOVCA,@A+DPTR;查表,读分支地址低8位PUSHACC;地址低8位入栈MOVA,TEMP;恢复A,指向地址高8位MOVCA,@A+DPTR;查表,读分支地址高8位PUSHACC;地址高8位入栈RET;分支地址弹入PC实现转移PRGTBL:DWROUT00;占用512个字节DWROUT01…2000H2003H2002H2001H高8位低8位…14第五章汇编语言程序设计例5-12大于256路分支转移程序功能:根据入口条件转向n个分支处理程序入口条件:(R7R6)=转移目的地址代号;出口条件:转移到相应分支处理程序入口。程序散转表中有N条LJMP指令,每条LJMP指令占3个字节,因此要按入口条件将址代号乘以3,用乘积的高字节加DPH,乘积的低字节送A(变址寄存器)。PRGTBL:LJMPROUT0LJMPROUT1LJMPROUT2……15第五章汇编语言程序设计参考程序:JMPN:MOVDPTR,#PRGTBL;DPTR指向表首址MOVA,R7;取地址代号高8位MOVB,#3;MULAB;×3ADDA,DPH;MOVDPH,A;修改指针高8位MOVA,R6;取地址代号低8位MOVB,#3;×3MULAB;XCHA,B;交换乘积的高低字节ADDA,DPH;乘积的高字节加DPHMOVDPH,AXCHA,B;乘积的低字节送AJMP@A+DPTR;散转16第五章汇编语言程序设计5-4循环程序包含多次重复执行的程序段,循环结构使程序紧凑。5-4-1循环程序的导出各个环节任务:一.初始化部分循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。二.循环体循环工作部分:需多次重复处理的工作。循环控制部分:1.修改指针和循环控制变量。2.检测循环条件:满足循环条件,继续循环,否则退出循环。三.结束部分处理和保存循环结果。1)已知循环次数2)循环次数未知允许0次循环的循环结构:在循环工作之前检测循环条件。循环控制?循环工作循环结束循环初始化YNNY17第五章汇编语言程序设计单重循环简单循环结构:循环体中不套循环。例:求n个单字节数据的累加,设数据串已在43H起始单元,数据串长度在42H单元,累加和不超过2个字节。SUM:MOVR0,#42H;设指针MOVA,@R0MOVR2,A;循环计数器R2←nCLRA;结果单元清0MOVR3,AADD1:INCR0;修改指针ADDA,@R0;累加JNCNEXT;处理进位INCR3;有进位,高字节加1NEXT:DJNZR2,ADD1;循环控制:数据是否加完?MOV40H,A;循环结束,保存结果MOV41H,R3RET片内RAM……Xn……43HX142Hn41HSUMH40HSUML18第五章汇编语言程序设计循环控制方法:计数控制、特征标志控制。一.计数控制:设循环计数器,控制循环次数。正计数和倒计数两种方式。例:为一串7位ASCII码数据的D7位加上奇校验,设数据存放在片外RAM的2101H起始单元,数据长度在2100H单元。MOVDPTR,#2100HMOVXA,@DPTRMOVR2,ANEXT:INCDPTRMOVXA,@DPTRORLA,#80HJNBP,PASS;判断是否加校验MOVX@DPTR,A;是,则加奇校验PASS:DJNZR2,NEXTDONE:SJMPDONE片外RAM……2102H011010002101H001011012100Hn19第五章汇编语言程序设计二.特征控制:设定循环结束标志实现循环控制。例:找正数表最小值。正数表存在片外RAM中以LIST为起始单元,用-1作为结束标志。START:MOVDPTR,#LIST;数表首地址MOVB,#127;预置最小值NEXT:MOVXA,@DPTR;取数INCDPTR;修改指针CJNEA,#0FFH,NEXT1;是否为数表结尾?SJMPDONE;循环结束NEXT1:CJNEA,B,NEXT2;比较NEXT2:JNCNEXT;Cy=1,则AB;Cy=0,则ABMOVB,A;保存较小值SJMPNEXTDONE:SJMPDONE20第五章汇编语言程序设计5-4-2多重循环循环体中套循环结构。以双重循环使用较多。例:将内存一串单字节无符号数升序排序。步骤:每次取相邻单元的两个数比较,决定是否需要交换数据位置。第一次循环,比较N-1次,取数据表中最大值。第二次循环,比较N-2次,取到次大值。…第N-1次循环:比较一次,排序结束。片内RAMMAX…5241TAB→3内循环控制?循环工作循环结束外循环控制?内循环初始化开始外循环初始化NNYY21第五章汇编语言程序设计SORT:MOVA,#N-1;N个数据排序MOVR4,A;外循环次数LOOP1:MOVA,R4MOVR3,A;内循环次数MOVR0,#TAB;设数据指针LOOP2:MOVA,@R0;取二数MOVB,AINCR0MOVA,@R0CJNEA,B,L1;比较L1:JNCUNEX;A≥B,不交换DECR0;否则交换数据XCHA,@R0INCR0MOV@R0,AUNEX:DJNZR3,LOOP2;内循环结束?DJNZR4,LOOP1;外循环结束?RETR3←R3—1=0?B←(R0)A←(R0+1)循环结束外循环次数→R4R4←R4—1=0?内循环次数→R3表首TAB→R0开始A≥B?(R0)←→(R0+1)R0←R0+1YNNYNYNY22第五章汇编语言程序设计软件延时程序用循环程序将指令重复多次执行,实现软件延时。试计算延时程序的执行时间。源程序指令周期(M)指令执行次数DELAY:MOVR6,#64H1I1:MOVR7,#0FFH1I2:DJNZR7,I22DJNZR6,I12RET2延时时间计算:(设时钟f=12MHz)t=(1×1+1×100+2×100×255+2×100+2×1)×M=51.3ms1100100×255100123第五章汇编语言程序设计5.5.2编写循环程序应注意的问题1)循环体前应注意安排循环初始化;2)内外循环间不应相互交叉。24第五章汇编语言程序设计5-5查表程序例5-19一个十六进制数存放在HEX单元的低四位,将其转换成ASCII码并送回HEX单元。编程:ORG0100HHEXEQU30HHEXASC:MOVA,HEXANLA,#00001111BADDA,#3;变址调整MOVCA,@A+PCMOVHEX,A;2字节RET;1字节ASCTAB:DB30H,3lH,32H,33HDB34H,35H,36H,37HDB38H,39H,41H,42HDB43H,44H,45H,46HEND25第五章汇编语言程序设计5-6子程序设计子程序:能完成某项特定功能的独立程序段,可被反复调用。优点:(1)不必重复书写同样的程序,提高编程效率;(2)程序的逻辑结构简单,便于阅读;(3)缩短了源程序和目标程序的长度,节省了程序存储器空间;(4)使程序模块化、通用化,便于交流,共享资源;(5)便于按某种功能调试。26第五章汇编语言程序设计1.子程序结构一.子程序入口用标号作为子程序名。二.调用子程序之前设置好堆栈。三.用返回指令RET结束子程序,并保证堆栈栈顶为调用程序的返回地址。四.子程序嵌套须考虑堆栈容量。五.提供足够的调用信息:如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。27第五章汇编语言程序设计2.参数传递入口参数:调用子程序之前,需要传给子程序的参数。出口参数:子程序送回调用程序的结果参数。(1)子程序无须传递参数28第五章汇编语言程序设计(2)用累加器和工作寄存器传递参数例5
本文标题:《单片机原理及应用》第五章 汇编语言程序设计
链接地址:https://www.777doc.com/doc-3794776 .html