汇编语言程序设计.ppt_第1页
汇编语言程序设计.ppt_第2页
汇编语言程序设计.ppt_第3页
汇编语言程序设计.ppt_第4页
汇编语言程序设计.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章 汇编语言程序设计, 汇编语言程序设计, 顺序结构程序设计, 分支结构程序设计, 循环结构程序设计, 查表程序设计, 子程序设计,如果在程序中需要根据不同条件,采取不同的处理方法,就应采用分支结构,而分支程序是通过转移指令实现的。 在MCS51单片机指令系统中, 有JZ(JNZ)、 CJNE、 JC(JNC)及JB(JNB)等丰富的控制转移指令, 它们是分支结构程序设计的基础, 可以完成各种各样的条件判断、分支。 分支结构程序有两种,单分支选择结构和多分支选择结构。,二、分支结构程序设计,编写分支结构程序重点在于正确使用转移指令。转移指令有3类:无条件转移、条件转移和散转。 1)无条件转移 它的程序转移方向是程序设计者事先安排的,与已执行程序的结果无关,使用时只需给出正确的转移目标地址和偏移量。 2)条件转移 它是根据已经执行程序对标志位或对累加器或对内部RAM某位的影响结果,决定程序的走向,形成各种分支。 3)散转 它是根据某种已输入的或者运算的结果,使程序分别转向各个处理程序中去。MCS-51中的JMP A+DPTR可以方便地实现散转功能。,例:设变量x存放在VAR单元中,函数值y存放FUNC中,按下式给y赋值。,1、无条件/条件转移程序,解:设VAR单元为内部RAM的30H单元,FUNC单元为内部RAM的3lH单元。,JZ,JNB,程序如下: VAR EQU 30H FUNC EQU 31H MOV A,VAR ;取x JZ COMP ;为零转COMP JNB ACC.7,POSI ;x0转POSI MOV A, # 0FFH ;x0,-1A SJMP COMP POSI: MOV A,#01H COMP:MOV FUNC,A END,散转指令JMP A+DPTR是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成散转的目的地址,装入程序计数器PC,其操作结果不影响累加器A和数据指针DPTR。,2、散转程序设计,(1)采用转移指令表,在不少应用场合中,需根据某一单元的内容是0,1,n,分别转向处理程序0,处理程序1,处理程序n。对于这种情况,可用无条件直接转移指令(AJMP或LJMP指令)组成一个转移表,然后把标志单元的内容读入累加器A,转移表首地址放入DPTR中,再利用指令JMP A+DPTR实现散转。,例:根据R2中的内容,转入各个操作程序:,R2=0, 转入OPR0 R2= l, 转入OPR1 R2=2, 转入OPR2 R2=n, 转入OPRn,程序如下: JUMP: MOV DPTR,# JPT ;跳转表首地址JPT送数据指针 MOV A,R2 ADD A,R2 ;R22A JNC LN ;判断有否进位 INC DPH ;有进位则加到高字节地址 LN: JMP A+DPTR ;转向已经形成的散转地址入口 JPT: AJMP OPR0 ;直接转移地址表 AJMP OPR1 AJMP OPRn,上面程序中每条“AJMP”指令占用2个字节,各转移指令“AJMP”地址相差两个字节,所以累加器A中变址值必须作乘2修正。若转移表是由三字节长转移指令“LJMP”组成,则累加器A中变址值必须乘3。当修正值有进位时,则应将进位先加在数据指针高位字节DPH上。 转移表中使用“AJMP”指令,这就限制了转移的入口地址OPR0、 OPR1 、 OPRn必须和散转表首地址JPT位于同一个2 KB范围内。另外规定散转点不能超过256个,因为工作寄存器R2为8位寄存器。为了克服上述局限性,除了可以使用“LJMP”指令组成跳转表外,还可采用双字节的寄存器存放散转值,并利用对DPTR进行加法运算的方法,直接修改DPTR,然后再用散转指令实现散转。,(2)采用地址偏移量表,例:根据R6中的内容转向4个操作程序。,OPR0: 操作程序0 OPR l: 操作程序1 OPR2: 操作程序2 OPR3: 操作程序3,R6=0,1,2,3,分别为操作程序0,1,2,3。地址偏移量表每项对应一个操作程序的入口,占一个字节,分别表示对应入口地址与表首的偏移量。,TAB:DB OPRT0 DB OPRT1 DB OPRT2 DB OPRT3,在散转程序中,如果散转点较少,所有操作程序处在同一页,即256B时,可以使用地址偏移量转移表。,地址偏移量,(3)采用转向地址表,前面介绍的地址偏移量转向限制在一页范围内,故使用受到一定限制。在转向范围较大时,可以直接使用转向地址表,它的各项表目为各个转向程序的入口。散转时使用查表指令,按某个单元的内容查表找到对应的转向地址,把它装入DRTR中,然后对累加器A清“0” ,再用JMP A+DPTR直接转向各个处理程序。,可以实现64KB范围内的转移,但散转数n应小于256。,例:根据R6中的内容转向OPR0、OPRl、OPR2、OPRn 操作程序中去。,TAB:DW OPR0 DW OPR1 DW OPR2 DW OPRn,各操作程序 的入口地址,(4)利用“RET”指令实现散转程序,前面介绍的几种方法,均是采用JMP A+DPTR散转指令 来实现散转功能的。 实际上,在使用转向地址表时,还可以用RET指令来实现散转。 在上例中,找到转向地址后,不是把它装入DPTR中,而是把 它压入堆栈中(先为低字节,后为高字节,即模仿调用指令)。 然后通过执行RET指令来把该地址退栈到PC中,这样PC值就是 要跳转的程序段地址值。,循环程序的构成 1、循环初态 设置循环初始状态,如建立地址指针,设置循环计数器初值等; 2、循环体 重复执行的程序段,完成主要的计算或操作任务; 3、循环控制部分 用于控制循环的执行和结束,不满足结束条件,重复执行循环体工作部分,满足条件,则退出循环; 4、结束部分 处理和保存循环程序执行的结果。,在处理实际问题时,有时要求某些程序多次重复执行,此时就应利用循环结构实现,这样可以使程序简练,不易出错,节省存储单元。,三、 循环结构程序设计,例: 已知:MCS-51单片机使用的晶振为6MHz,要求设计一个软件延时程序,时间为12ms。,解:延时程序的延时时间与两个因素有关:晶振频率和延时程序中的循环次数。一旦晶振确定之后,主要是计算需要给定的延时循环次数。本题中晶振为 ,则一个机器周期为: ,即 。设计二重循环程序,内循环为l ms延时,外循环12次。,周期数 ORG 2000H 1 MOV R0,#0CH ;12R0 1 DL2:MOV R1,#MT ;l ms延时的循环次数R1 1 DL1:NOP 1 NOP 2 DJNZ Rl,DL1 ;l ms延时循环 2 DJNZ R0,DL2 ;毫秒数减1,不等于0继续循 环,等于0结束 END,本程序中内循环的预定值MT尚需计算,因为各条指令的执行时间是 确定的(周期数一定),需要延时的总时间1ms也已确定,因而 MT可由如下方程计算: MT1257DH,例: 把内部RAM的20H30H单元中的内容,传送到外部RAM的1000H单元,并将原数据区清零。,分析:通过单元地址相减可知字符串长度,可用该长度作为循环次数,但要注意单元地址相减得到的值要加1才是真正的字符串长度,其流程如图所示。,程序清单: MAIN: MOV R1,# 20H ;源字符串首地址 MOV A,#30H ;字符串首末地址相减 CLR C SUBB A,R1 ;计算字符串长度 INC A ;长度加1 MOV R2,A ;存字符串长度 MOV DPTR,#1000H ;目的字符串首地址 LOOP1: MOV A,R1 MOVX DPTR,A ;传送 MOV R1,#00H ;原数据区清零 INC R1 ;修改指针 INC DPTR DJNZ R2,LOOP1 ;判断字符串是否结束? END,所谓查表法,就是对于一些复杂的函数运算,事先把其运算结果按一定规律编制成表格,存放在程序存储器中。当用户在程序中需要这些函数时,直接在表格中寻找答案。 在控制应用场合和智能化仪器中常使用这些方法。 MCS-51中有2条查表指令:MOV A,A+PC MOV A,A+DPTR,例: 将十六进制数转换为ASCII码的子程序。,解:现在用查表法设计子程序。 设程序的入口、出口都在R0中,表中所有的值都是单字节, 表格长度为16字节。,四、查表程序设计,地址 ORG 2000H 2000H MOV A,R0 2001H ANL A,# 0FH ;保留低4位 2003H ADD A,#2 2005H MOVC A,A+PC ;查表获取ASCII码值 2006H MOV R0,A 2007H RET 2008H TAB: DB 30H,3lH,32H 200BH DB 33H,34H,35H 200EH DB 36H,37H,38H 2011H DB 39H,4lH,42H 2014H DB 43H,44H,45H,46H,;变址调整,2008H-2006H =2,例:用查表法将压缩的BCD码数转换为ASCII码。,解:R0:BCD码的存储首地址 R7:字节数 R1:存结果的存储首地址,BCDASC:MOV A,R0 ;取待转换的BCD数 MOV R2,A ;暂存R2中 ANL A,# 0FH ;屏蔽高4位 MOV DPTR,#TAB ;表首地址送DPTR MOVC A,A+DPTR ;查表 MOV R1,A ;存转换结果,压缩的BCD 码低4位转换 为ASCII码,MOV A,R2 ANL A,# 0F0H ;屏蔽低4位 SWAP A ;交换 MOVC A,A+DPTR ;查表 INC R1 MOV R1,A INC R1 INC R0 DJNZ R7,BCDASC END,压缩的BCD 码高4位转换 为ASCII码,例:用查表法将16进制数转换为ASCII码的子程序。,解:R0:16进制数首地址 R2:字节数 R1:ASCII码的首地址,以下程序中每一个单元存放2个16进制数,转换为ASCII码后存 入2个单元,低位存入低地址,高位存在高地址单元中。,HASC:MOV A,R0 ;取16进制数低字节 ANL A,# 0FH ;屏蔽高4位 ADD A,#10H MOVC A,A+PC ;低4位转换为ASCII码 MOV R1,A ;存入RAM,INC R1 MOV A,R0 ANL A,# 0F0H ;屏蔽低4位 SWAP A ADD A,# 7 MOVC A,A+PC ;高4位转换为ASCII码 MOV R1,A ;存入RAM INC R0 INC R1 DJNZ R2,HASC DEC R1 RET TAB:DB012345678 DB9ABCDEF,HASC:MOV A,R0 ANL A,# 0FH ADD A,#10H MOVC A,A+PC MO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论