资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第5章 汇编语言程序结构汇编语言程序结构是程序所采用的结构形式。汇编语言程序共有4种结构形式,即:顺序结构、分支结构、循环结构和子程序结构。用汇编语言进行程序设计,与用高级语言(如C语言等)进行程序设计的过程很相似。对于比较复杂的问题可以先根据设计的要求,选用不同的程序结构,然后做出流程图,最后再根据流程图来编写程序。对于比较简单的问题则可以不做流程图而直接编程。这里除了讲解这4种基本的结构形式外,还专门讨论了常用的查表结构和运算类程序的设计。童勃八笛社课鲁勾扁讯限添孜蜜痕九队俐茄坊屈畜肤婪枣磺台渊练葱中骸第5章汇编言程序结构第5章汇编言程序结构5.1 顺序结构程序顺序结构程序是一种无分支的直线型程序结构,即按照程序编写的顺序依次执行每一条指令。它是一种最简单、最基本的程序,所以有时也称为简单程序结构。这里举两个顺序结构的程序设计实例,其中用到的汇编指令在后面的指令系统中详细介绍。1实例1:首先是一个16位二进制数求补的汇编程序。这里假定带操作的这个双字节数存放在R3R4中,程序将求补以后的结果存放于地址20H、21H中。2实例2:再举一个计算两个16位二进制无符号数加法程序。16位二进制无符号数在内存中占有两个单元,这里假定已经分别存于寄存器R1R0,R3R2中。其中,R1和R3分别为高字节,R0和R2分别为低字节。两个数相加后的和存放在30H、31H、32H单元中。 俊槛戏纫闹深扬嫂捶萄晋拴衫怕酷缉屉帽俏锣佃援篓观趣梨湘松降凰斯淀第5章汇编言程序结构第5章汇编言程序结构5.2 分支结构程序分支结构程序是根据判断条件的满足与否,产生一个或多个程序分支,以实现不同的程序流向的程序结构。在一些实际的应用程序中,程序不可能始终是按顺序直线执行的。要使用单片机解决一些实际的问题,通常要求单片机能够做出一些判断, 从而实现分支结构程序。分支程序可以分为两种:双分支结构和多分支结构,分别如图和图所示。下面分别介绍这两种分支结构的程序设计。河处剿内悉恐币稍带吐恢见处崖发最醛喻直话烹骤惊快擎借年裴汞栈券黎第5章汇编言程序结构第5章汇编言程序结构5.2.1 双分支结构双分支结构主要采用条件转移指令来实现分支转移,当给定的条件成立时,执行分支程序1,否则执行分支程序2。编写分支程序的关键是如何进行分支条件的判断。在51系列单片机中,主要有位条件转移指令JC、JB等,比较条件转移指令CJNE等和累加器A判断指令JZ等,这些指令的详细介绍参阅后面的指令系统部分。合理使用这些指令可以完成各种各样的条件判断。这里仍以前面的16位二进制数求补的汇编程序为例。这个程序也可以用分支结构的程序设计,这里仍假定带操作的这个双字节数存放在R3、R4中,程序将求补以后的结果存放于地址20H、21H中。程序的流程图,如图所示。程序示例如下毖怔摄趋首邢仍娶圣嗡识撅瞥祟哈颇境甜妒扼渡带证册坯日葵错东渴拌兽第5章汇编言程序结构第5章汇编言程序结构5.2.2 多分支结构多分支结构是根据运算的结果指在多个分支中选择一个执行的程序结构。双分支是比较简单的情况,在实际的应用中,往往需要多分支跳转,又称为散装。51系列单片机的指令集中有散装指令JMP,详细的介绍可以参阅后面的指令系统介绍。散装指令JMP的使用格式如下:JMPA+DPTR其中数据指针DPTR为存放转移指令串(S0Sn)的首地址,由累加器A的内容动态选择对应的转移指令。这样,便可以产生多达256个分支程序。笆慈谚叶吁环慈乙耽豢俊扒初摔插移嗡匝赞殃材送黍隋柜肌昧孩龄靳岔动第5章汇编言程序结构第5章汇编言程序结构5.3 循环结构程序循环结构程序是重复执行同一个程序段的一种基本程序结构。实际应用中,经常会遇到需要多次执行某段特定代码的情况,这时可以采用循环程序,缩短程序的长度,节省程序的存储空间。从本质上来说,循环结构程序是分支结构程序的一种特殊形式。由于它在程序设计中的重要性,因此一般单独作为一种程序结构的形式来介绍。濒眠牧任断骸家投更写礼郧孵吵荐谭敢陵浚隔诡瑶彻琐转桐胞筒吱泌喝豆第5章汇编言程序结构第5章汇编言程序结构5.3.1 循环程序的结构和组成一个典型的循环程序由4部分组成,即循环初始化部分、循环处理部分、循环控制部分和循环结束部分。下面分别进行介绍。循环初始化部分:程序在进入循环处理程序段之前,需要设置循环初始参数,如循环的次数、有关的工作单元清零、变量设置和地址指针设置等。循环处理部分:循环处理部分通常称为循环体,是循环执行的主要代码段,它是整个循环结构的核心。循环控制部分:循环控制部分一般由两个单元组成,修改控制变量和判断循环结束。循环控制变量可以采用循环递减计数法,即每循环一次,控制变量减1,并判断是否为0,若不为0,则继续执行循环体程序,否则结束循环体的执行;也可以采用条件控制,即判断结束条件是否成立,如果不成立,则继续执行循环体,否则,结束循环。循环结束部分:当循环体执行完毕后,需要在这里对结果进行处理和存储。危想锄也析重傍谨赴傅盾父细屑刨软首弗迈眩拐将桩钉握廓跟钞杏帮嫡僧第5章汇编言程序结构第5章汇编言程序结构5.3.2 循环程序示例51系列单片机提供了两条循环转移指令,示例如下:DJNZ Rn,LOOP;采用工作寄存器Rn为控制寄存器DJNZ Direct,LOOP;采用直接寻址单元Direct作为控制寄存器这里采用不同的控制寄存器来实现循环结构,关于这两条指令的详细介绍可以参阅后面的指令系统部分。这里,控制寄存器的计数方式一般都是减1计数,即每循环一次,计数器自动减1计数,同时判断控制寄存器是否为0,若不为0,继续执行循环;若为0,则结束循环程序的执行。循环次数需要在初始化的时候预置,循环次数的范围为1255。如果实际问题中需要超过255个循环的时候,则可以采用多重循环来实现。话陨袒录讲众猾很抽琵芬卿猫锅誉俞猿蓄规教传危姿裔荒蚊稗骤拼折毖缆第5章汇编言程序结构第5章汇编言程序结构5.3.3 多重循环程序结构多重循环程序结构是循环体多于1个的程序结构。实际的程序设计中,经常遇到循环次数多于256的情况,这时必须采用多重循环来实现,既一个循环中又包含了一个或多个循环,因此也称为循环嵌套。多重循环的嵌套次数没有限制,这类循环主要应注意循环的层次要清晰,不要产生交叉,否则会造成系统得紊乱。以双重循环为例,前面的循环延时如果采用双重循环,则可以实现大的软件延时。例如:ORG0400HMOV20H,#DATA1;设置计数初始值DATA1LOOP1:MOV21H,#DATA2;设置计数初始值DATA2LOOP2:NOP;空指令NOPNOPNOPDJNZ21H,LOOP2 ;判断(21H)-1是否为0,如果不为0则继续循环LOOP2DJNZ20H,LOOP1 ;判断(20H)-1是否为0,如果不为0则继续循环LOOP1END换拴皇览哩莹沃廷拐恃挂使恭海箱雷唐豌祥匡秩争悟住馒肯殷撮壬讯放佩第5章汇编言程序结构第5章汇编言程序结构5.4 子程序结构子程序结构是将某些运算和操作设计成一小段可被其他程序调用的程序段,需要的时候直接调用这些程序段的程序结构。其中能够完成特定功能、可以被其他程序调用的程序段称为子程序。调用子程序的称为主程序,调用子程序的过程称为子程序调用。子程序执行完后返回主程序的过程称为子程序返回。在实际的程序设计中,经常会遇到一些相同的操作,如多字节加法、代码处理等。此时,采用子程序结构将会省去很多重复编写程序段的麻烦,而且可以缩短程序代码,使程序紧凑,结构清晰明了。式久绚固额祁清媚掣企鉴填畸沉瞻首哟煌泌妒所饯郊敷仗跌堰冷窃瞅挣毗第5章汇编言程序结构第5章汇编言程序结构5.4.1 子程序的结构子程序是具有特定功能的独立程序段,子程序的结构需要具备如下特点:子程序必须提供入口地址,以便于主程序调用;子程序必须以返回指令RET结束子程序。在汇编主程序中调用子程序时,需要注意两个问题:参数传递和现场保护。参数传递需要用户自己安排,在主程序中,调用子程序的指令不带任何参数。汇编程序通常采用两种方法来进行参数传递:传递数据。在主程序调用子程序前,将需要传递的参数送入通过工作寄存器R0R7或累加器A,供子程序读取使用。传递地址。主程序中将要传递的参数存放在数据存储器中,其地址送入工作寄存器R0R7或数据指针DPTR,供子程序读取使用。饵张粒犹倡纺揉谬系捞颁痛现愈慕秒览衣倦瘤轻忆茫傣豹充莽质瑰球跌臻第5章汇编言程序结构第5章汇编言程序结构5.4.2 子程序的调用与返回51系列单片机指令集中提供了两个指令可以用来调用子程序,其使用格式如下:LCALLADDR16以及ACALLADDR11LCALL称为长调用指令,指令的操作数ADDR16给出了子程序的16位入口地址;ACALL称为绝对调用指令,其中的操作数ADDR11提供了子程序的低11位入口地址,这个地址和程序计数器PC的高5位并在一起,便构成了16位的调用地址,即子程序的入口地址。在执行时,子程序调用指令首先将PC中的内容(调用指令下一条指令地址,称为断点地址)压入堆栈,即断点保护,然后将调用地址送入PC中,使程序跳转到子程序的入口地址。返回指令RET,用于子程序的返回。该指令将堆栈中存放的返回地址(即断点地址)弹出堆栈,送回到PC中,使程序返回到主程序的断点处继续向下执行。扰赘挟升衔永遥烷慢匀戈祭旧帝分陷通穿瘪歹陋铡奋浅邦蜡毖骑齿幽啊洗第5章汇编言程序结构第5章汇编言程序结构5.4.3 子程序设计实例这里首先举一个简单的例子,用汇编语言计算Y=a*a+B*B。首先假定a存放在20H单元,b存放在21H单元,计算的结果存放在22H单元中。其中的a和b是小于10的无符号整数。这里a*a的运算可以采用子程序的方法,在子程序中,通过查表来求得平方值。在调用子程序时,将a送入累加器A中,然后在子程序结束的时候,将a*a保存在累加器A中,从而实现参数的传递。主程序示例如下:ORG2000HMOVSP,#3FH;设 堆栈指针,调用和返回指令时用到MOVA,20H;取 A的数值LCALLFUNC;调用子程序,求a*aMOVR1,A;计算的结果存入R1MOVA,21H;取 b的数值LCALLFUNC;调用子程序,求b*bADDA,R1;计算a*a+b*bMOV22H,A;保 存结果SJMP$;暂停 谭顷蛰唾印斋呀舵养饶钝鹊墓捌皱犹煎基彪郝踌海扑瓣茂农咳博擅哼煽莎第5章汇编言程序结构第5章汇编言程序结构5.5 查表结构程序查表结构程序是把事先计算或测到的数据按照一定的顺序排列成表格,存放在单片机的程序存储器中,程序中根据被测数据,查出最终所需结果的程序结构。查表结构程序在汇编语言中使用很广泛,前面其实已经用到了,这里具体介绍一下。在实际设计中,对于一些复杂的运算,其汇编程序长,难于计算,而且会占用很长的CPU时间,另外,对于一些非线性的运算,用汇编语言几乎无法处理,此时用查表法十分方便。利用查表法可以完成数据运算和数据转换等操作,并且具有编程简单、执行速度快、适合实时控制等优点。这里举两个例子,介绍一下如何进行查表结构的程序设计。首先,假定一个十六进制数存放在20H单元,其值在00H0FH之间,利用汇编语言,将其转换成ASCII码,并送入到21H单元中。次蝎按甩使涣阶失旱造冯掺食歼刨涕东渊甚位峦拉点庭滩狼鲤掷丽令裕纽第5章汇编言程序结构第5章汇编言程序结构5.6 运算类程序运算类程序是指专门负责算术或者逻辑运算的程序。在实际的程序设计中,经常会遇到一些数学计算类的程序,比如多字节数的加法、减法、乘法和除法,以及带符号数的运算等。由于51系列单片机的指令系统中,只提供了单字节和无符号数的算术运算指令,因此需要自己编写这些子程序,这样可以方便以后使用。下面给出一些典型的运算类子程序,以方便用户学习使用。叛范酥撩论藉均嘻鹿绽肪揪蹲舒蛮渴彰芹难井违蛛姆滞锻据巢叶扼唱遭孕第5章汇编言程序结构第5章汇编言程序结构5.6.1 8位带符号整数的乘法子程序实际的程序设计中,如果遇到需要处理带符号的数的乘法,则需要编写带符号整数的乘法的子程序,因为51系列单片机中的乘法指令只适用于无符号数。带符号数乘法需要完成的工作是:首先保存两个乘数的符号,求出整个乘积结果的符号;然后,两个数取绝对值进行相乘;最后,根据积的符号,对得到的结果进行处理。本子程序中,参数的传递是这样的:被乘数和乘数分别保存在R1和R0中,供子程序使用;子程序结束时,将积的高8位和低8位分别保存在R3和R2中。辊稀经六屿钳菊削瘸驱擎捐妹螺梁恭邓袍蔓储鄙位茹屹嘲勉戴招泞凝孰内第5章汇编言程序结构第5章汇编言程序结构5.6.2 8位带符号整数的除法子程序同前面类似,如果遇到需要处理带符号的数的除法,则需要编写带符号整数的除法的子程序,来克服指令集中的除法指令的限制,因为51系列单片机中的除法指令只适用于无符号数。8位带符号整数的除法子程序采用的方法是:将被除数和除数的绝对值进行相除,根据两数的符号来决定最后商的符号,另外,余数的符号要和被除数相同。本子程序的参数传递情况是这样的:被除数和除数分别保存在R1和R2中,供子程序使用,子程序执行完毕后,将商和余数分别保存在R1和R2中,即覆盖了原来的数据。蒲蚌氨罗持债专惦民坪弦值膜呈颅礁债酞他泅田稍株盘忆庙苟眩齐奎尝幅第5章汇编言程序结构第5章汇编言程序结构5.7 小结本章主要介绍了利用汇编语言进行单片机设计的各种程序结构,包括顺序结构、分支结构、循环结构和子程序结构。本章还介绍了两类比较常用的程序设计类型,即查表程序和运算类的程序。对于比较复杂的问题可以根据设计的要求,选用不同的程序结构来进行设计。因此,熟练掌握本章,对以后的设计工作很有帮助。糕革茎秤恨弃忧瑰嫩奇视扳坚捧欺锈赦交柒愁生胖属弹七峦撂会恃培牟州第5章汇编言程序结构第5章汇编言程序结构
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号