您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第五章汇编语言程序设计方法
50第五章汇编语言程序设计方法本章课题:汇编语言程序设计方法教学内容:1)、汇编语言程序设计2)、顺序与循环程序设计方法3)、分支程序设计方法4)、查表程序设计方法5)、子程序设计方法6)、综合程序设计方法教学目的:通过本章的学习应掌握汇编语言程序设计方法,具备较复杂程序设计能力。本章重点:汇编语言程序设计方法本章难点:分支程序设计方法教案:第一节汇编语言程序设计1、程序设计语言1)、机器语言直接用二进制数表示指令和数据的最原始的程序设计语言。2)、汇编语言用助计符来表示的面向机器的程序设计语言。用汇编语言编制的程序须要用“人工汇编”或“机器汇编”将其翻译成机器语言,才能被机器认识。3)、高级语言高级语言是一种面向过程而独立于计算机硬件结构的通用计算机语言。如FORTRAN、PASCAL、C语言等。注意:①机器语言直接面对机器,实时性好,但难以编出较复杂的程序,现基本上被汇编语言代替;②汇编语言是目前单片机初学者采用的一种编程方法,它具有实时性强,对较复杂的程序也能编制。51③高级语言它面向过程易于编制复杂程序,具有通用性好,程序简单,但它要求占用较大的内存空间,实时性差,目前从事单片机的开发和研究工作须掌握这种方法。2、汇编语言的规范1)、汇编语言源程序的格式标号:操作码目的操作数,源操作数;注释2)、汇编语言伪指令①ORG----起始地址伪指令;功能:用来规定目标程序或数据的起始地址。格式:[标号:]ORG16位地址说明:在一个程序中允许有多个ORG指令,以规定不同程序段的起始位置。②END-----汇编结束伪指令;功能:用来告诉汇编程序,此源程序到此结束。格式:[标号:]END说明:在一个程序中有且只有一个END指令。例如:ORG1000HSTART:MOVA,BJNBACC.7,DONECPLADONE:MOVB,AEND③EQU----赋值伪指令;格式:字符名称EQU数或汇编符号功能:将右边值赋给左边用户定义的字符说明:a、由EQU赋的字符可以作数值、数据地址、代码地址。b、由EQU伪指令所定义的符号必须先定义后使用。例如:SDGFGEQU58H;表示SDGFG=58H④DB----定义字节伪指令;格式:[标号:]DB8位(二进制)数据表。52功能:用于告诉汇编程序从指定的地址单元开始,定义若干个字节存储单元的内容。说明:a、数据表可以是二进制数也可以是ASCⅡ编码,数据之间用逗号分开,ASCⅡ要加单引号,如C,要写成‘C’。b、它只适应程序存储器。例如:ORG1000HFIRST:DB73H,20H,45H,67H,01HMOVA,#55HDB34H,67H,89H,70H执行后的结果如图1所示⑤、DW------定义值伪指令;功能:用来告诉汇编程序从指定的地址单元开始,定义若干个16位数据(二进制)。格式:[标号:]DW字常数或ASCⅡ字符说明:a、字常数可以是8位也可以是更多位。b、尽管在存储数据的形式上与DB相同但使用不一样,DB后面只能跟8位的数据或ASCⅡ字符。C、它只适应程序存储器。d、单个DW、DB定义的数表个数不得超过80个,多于80个数据应用多个指令完成例如:ORG1000HPIOI:DW5678H,1234H,2379H结果如图2所示。⑥、TA-----数据地址赋值伪指令;格式:字符名称DATA表达式功能:它的功能是给标号段中的标号赋以数值。说明:a、本语句与EQU相似,但本语句可以先用后定义;b、在程序中它常用来定义数据地址。⑦、BIT-----位地址赋值伪指令;1000H73H1001H20H1002H45H1003H67H1004H01H1005H74H1006H55H1007H34H1008H67H1009H89H100AH70H地址:数据1000H56H1001H78H1002H12H1003H34H1004H23H1005H79H图1由DB建立的数据表图2由DW建立的数据表53格式:字符名称BIT位地址功能:用于告诉汇编程序,把位地址赋予规定的字符名称,用于位处理程序中。例如:X0BITP1.03、汇编语言程序设计方法1)、程序设计过程①建立数学模型②选择适当的算法③编制程序流程图④汇编语言程序设计⑤汇编语言程序调试2)、程序流程图①程序流程图的作用能直观形象地表示各部分的逻辑关系及程序结构,它是设计程序特别是复杂程序的重要工具。②程序流程图的组成端点框表示程序的开始或结束,用表示,可在内填上相应文字。流程线表示程序的组向,用方向键表示。处理框表示一种处理功能;框内用文字说明。用表示。判断框用表示,该框用于指示一个判定点,从这点产生分支,在框内就注明测试条件,而测试结果应注明在各分支流程线上。连接框连接框用表示,它表示流程中止而并非流程结束。通常用来辟免流程线交叉,在流程图中标识相同的连接框表示流程相连。子程序框54用表示,该框表示调用子程序。在该框内填入相应的子程序名称或入口地址。③程序流程图的设计程序流程图的设计将在具体的程序设计方法中针对具体的例子加以介绍。第二节顺序与循环程序设计方法1、顺序程序设计1)、顺序结构程序设计方法建立数学模型画程序流程图编写汇编程序2)、应用举例例1:设有16位二进制数存放在R0、R1中(R0存放高位),试编写实现16位二进制数“取反加1”的操作程序。解法1:程序流程如图3所示,程序如下:ORG1000HSTART:MOVA,R1CPLAADDA,#01HMOVR1,AMOVA,R0CPLAADDCA,#00HMOVR0,AEND解法2:通过将R0、R1分别送DPTR的高低字节,然后利用INCDPTR实现加1,取反后再用:CPLA这样的指令实现。例2:设在8031单片机内部RAM的40H单元中存放8位二进制数,要求将其转换成相应BCD码并由高位的顺序存入内部RAM以60H为首址的3个连续单元中,试编写相应程序:开始低位取反加1高位取反加C结束图3程序流程图55解:本题的关键是如何将二进制数转换成BCD码。由数学变换知:8位二进制/100=BCD码的百位数余数/10=BCD码的十位数余数=BCD个位数程序如下:ORG1000HBINBCD:MOVR0,#60HMOVA,40HMOVB,#100DIVAB;整数存于A中MOV@R0,AINCR0MOVA,#10XCHA,BDIVABMOV@R0,AINCR0XCHA,BMOV@R0,AEND思考题:对于任意一个16进制表示的数,如AB9EF087,存放在以20H为首址的单元中,如何将其转化成BCD码?2、循环程序设计方法1)、循环结构程序的组成①初始化部分:它是用来设置循环初始化状态,如设置地址指针、循环计数器初值等。②循环处理部分:它是重复执行的数据处理程序。③循环控制部分:它通过检测循环次数或循环结束条件从而控制程序循环继续与否。56④结束部分:它是对结果分析处理和存放结果。2)、循环程序设计方法(1)单循环程序设计方法①循环次数是已知的循环程序设计先分析要解决的问题,建立解决问题的数学模型,然后编写出对应的程序,按已知条件设置程序循环次数。②循环次数未知的循环程序设计先分析要解决的问题,建立解决问题的数学模型,确定待测定循环的参数,在编程过程中,选取合适的判别语句控制程序的循环。(2)多循环程序设计方法多循环程序设计除必须满足单循环程序设计的规则外,尚须符合循环不允许交叉的规定。3)、应用举例单循环程序设计举例:例1:已知80C51单片机使用6MHZ晶振,要求设计一个软件延时程序,延时时间为10ms。分析:晶振为6MHZ的单片机一个机器周期为2us,如果采用循环方法,控制程序循环次数,就可以实现定时功能。如图4为程序流程。如程序如下:周期数ORG2000H1MOVR0,#0AH;毫秒数1DL2:MOVR1,#MT1DL1:NOP1NOP2DJNZR1,DL12DJNZR0,DL2END定时值的确定:开始1ms延时R0-1R0R0=0?10R0结束YN图4程序流程图57(1+1+2)×2us×MT=1000usMT=7DH例2:用P1口作为数据读入口,为了读取稳定的值,要求连续读8次,然后取平均值。分析:设R0、R1作为连续8次累加的16位工作寄存器,且R0存放高位,R1存放低位,在二进制数的运算中,×2=二进制数左移一位,÷2=二进制数右移一位。因此本例中÷8=将数向右移3次。程序流程如图5,程序如下:程序:ORG2000HMOVR0,#00HM0VR1,#00HMOVR2。#08HLP2:MOVP1,#0FFHMOVA,P1ADDA,R1JNCLP1INCR0LP1:MOVR1,ADJNZR2,LP2MOVR2,#03H图5程序流程图CLRCLP3:MOVA,R0RRCAMOVR0,AMOVA,R1RRCAMOVR1,ADJNZR2,LP3开始清R0、R1设R2=8P1口读入数存R0、R1R2-1=0?累加结果/8结束YN58LP:SJMPLPEND注意:二进制数乘法、除法的计算方法例3:从22H单元开始有一无符号数据块,其长度放在20H单元中,求出数据快中最大值,并将其放在21H单元。分析:采用比较法,先设A=00H,然后依次取数与A中的值比较,若所比较的数比A大则用所取数替代A中的数。程序流程如图6,程序如下:程序:ORG2000HCLRAMOVR2,20HMOVR1,#22HLP:CLRCSUBBA,@R1JNCNEXTMOVA,@R1SJMPNEXT1NEXT:ADDA,@R1NEXT1:INCR1DJNZR2,LPMOV21H,ALP1:SJMPLP1图6程序流程图END第三节分支程序设计方法1、分支结构的理论基础①计算机具有逻辑判断能力,这是计算机实现分支程序的理论基础;②条件转移指令和比较指令是计算机实现分支程序的具体体现;2、分支程序设计过程开始程序初始化A=0、(20H)=R2、22H=R1C=0A-(R1)=AC=0?(R1)=AA+(R1)=AR1+1=R1R2-1=0?A=(21H)结束YYNN59①建立数学模型②选择确定分支条件③设计程序流程和用适当的语句设计程序3、分支程序设计方法1)、无条件转移程序设计这种程序转移方向是设计者事先安排的,它所使用的转移语句是无条件转移语句。例如:在系统诊断程序中,设置,当发生故障时,系统将无条件停机。2)、条件转移程序设计方法它是根据执行程序对标志位或累加器或对内部RAM某位的影响结果,决定程序的走向、形成各种分支。在编写程序时要注意两点:①选择适合的语句和安排可供判别的条件②正确选定所用的转移条件和转移目标地址例如:警情从单片机的P1.0输入,当系统检测到有警情发生时,立即调用拨号子程序,试编制实现上述过程的程序。分析:设拨号程序为TAB,主程序为NAME,则程序如下、程序流程如图所示程序:ORG1000HNAME:SETBP1.0JNBNAMELJMPTABTAB:………………END3)、散转程序设计方法①采用散转指令实现散转散转指令为:JMP@A+DPTR图7程序流程图实现方法:将要转移的地址在程序存储器中按照某种规律编一个表,以便使用散转指令开始P1.0置1P1.0=1?读P1.0口程序转移结束60在转移地址处用AJMP或LJMP等指令转到相应的处理程序举例说明:根据R7的内容,转向各个操作程序;R7=0转入OPR0R7=1转入OPR1…………………………R7=N转入OPRN解;程序流程如图8,程序如下:JUMP1:MOVDPTR,#JPTAB1MOVA,R7ADDA,R7JNCNOADINCDPHNOAD:JMP@A+DPTRJPTAB1:AJMPOPR0AJMPOPR1……………AJMPOPRNEND图8程序流程图②采用地址偏移实现散转如果偏移的地址在同一256B范转内,我们可以采用MOVCA,@A+DPTR指令,先求出地址偏移量A,然后再用JMP@A+DPTR转移到转移入口。例如:根据R7中的内容转向5个操作程序。解程序如下:JUMP3:MOVA,R7MOVDPTR,#TAB3MOVC
本文标题:第五章汇编语言程序设计方法
链接地址:https://www.777doc.com/doc-2189492 .html