您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第4章__汇编语言程序设计知识1
23:381第4章汇编语言程序设计知识单片机原理与接口技术23:3821.了解汇编语言编程的基础知识;2.了解汇编语言程序设计的基本步骤和方法;3.了解汇编语言的特点:目标程序效率高、占存储空间少、运行速度快、实时性强等;4.掌握89C51汇编语言的几种结构:顺序、分支、循环、查表及子程序的结构;5.掌握一些常用汇编子程序的编程方法。6.掌握常用的一些伪指令。本章教学要求第4章汇编语言程序设计知识23:3834.1.1编程步骤1、分析问题2、确定算法3、画程序流程图4、编写源程序4.1编程的步骤、方法和技巧23:3841、分析问题对需要解决的问题进行分析,以求对问题由正确的理解。解决问题的任务是什么?工作过程?现有的条件,已知数据,对运算的精度和速度方面的要求?设计的硬件结构是否方便编程?23:3852、确定算法算法是如何将实际问题转化成程序模块来处理。在编程以前,先要对几种不同的算法进行分析、比较,找出最适宜的算法。23:3863、画程序流程图程序流程图是使用各种图形、符号、有向线段等来说明程序设计过程的一种直观的表示。流程图步骤分得越细致,编写程序是也越方便。画流程图是程序结构设计是采用的一种重要手段。一个系统软件有总的流程图(主程序流程图)和局部的流程图(子程序流程图)。流程图常采用的图形和符号。23:387椭圆框或桶形框:表示程序的开始或结束。矩形框:表示要进行的工作。菱形框:表示要判断的事情,菱形框内的表达式表示要判断的内容。圆圈:表示连接点指向线:表示程序的流向程序流程图常用的图形及符号23:3884、编写源程序用89C51汇编语言编写的源程序行(一条语句)包括四个部分,也叫四个字段:〔标号:〕操作码〔操作数〕;〔注释〕每个字段之间要用分隔符分隔,而每个字段内部不能使用分隔符。可以用作分隔符的符号:空格“”、冒号“:”、逗号“,”、分号“;”等。例:MAIN:MOVA,#00H;立即数00H→A23:389标号:标号是用户定义的符号地址。一条指令的标号是该条指令的符号名字,标号的值是汇编这条指令时指令的地址。标号由以英文字母开始的1~8个字母或数字组成,以冒号“:”结尾。标号可以由赋值伪指令赋值,如果没有赋值,汇编程序把存放该指令目标码第一字节的存储单元的地址赋给该标号,所以,标号又叫指令标号。23:3810操作码操作码是必不可少的。它用一组字母符号表示指令的操作码。在89C51中,由89C51的指令助记符组成。23:3811操作数汇编语言指令可能要求或不要求操作数,所以这一字段可能有也可能没有。若有两个操作数,操作数之间用逗号“,”分开。操作数包括的内容有:(1)工作寄存器:由PSW.3和PSW.4规定的当前工作寄存器区中的R0~R7。(2)特殊功能寄存器:21个SFR的名字。(3)标号名:赋值标号—由汇编指令EQU等赋值的标号;指令标号—指令标号指示的指令的第一字节地址是该标号的值。23:3812(4)常数:可用二进制(B)、十进制、十六进制(H),若常数以字符开头,前面加0。(5)$:用来表示程序计数器的当前值。(6)表达式:汇编时,计算出表达式的值填入目标码。23:3813注释注释部分不是汇编语言的功能部分,只是用语增加程序的可读性。良好的注释是汇编语言程序编写中的重要组成部分。具体要求:初学一定要加注释!23:38144.1.2编程的方法和技巧1、程序功能模块化的优点单个模块结构的程序功能单一,易于编写、调试和修改。便于分工,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。程序可读性好,便于功能扩充和版本升级。对程序的修改可局部进行,其它部分可以保持不变。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。一、模块化程序设计方法23:3815每个模块应具有独立的功能,能产生一个明确的结果,即单模块的功能高内聚性。模块之间的控制耦合应尽量简单,数据耦合应尽量少,即模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换频繁程度。模块长度适中。20条~100条的范围较合适。2、模块划分的原则23:38161、尽量采用循环结构和子程序。2、尽量少用无条件转移指令。3、对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出),即保护现场。4、在中断处理程序中,除了要保护处理程序中用到的寄存器外,还要保护标志寄存器。5、用累加器传递入口参数或返回参数比较方便,在子程序中,一般不必把累加器内容压入堆栈。二、编程技巧23:38174.1.3汇编语言程序的基本结构一、顺序程序顺序程序是最简单的程序结构,即顺序结构。程序按顺序一条一条地执行指令。23:3818例4-1将片内RAM的20H单元中的压缩BCD码拆成两个ACSII码存入21H、22H单元。低4位存在21H单元,高4位存在22H单元。---顺序程序实例MOVA,20HMOVB,#10H;除以10HDIVABORLB,#30H;低4位BCD码转换为ASCII码MOV21H,BORLA,#30H;高4位BCD码转换为ASCII码MOV22H,A压缩BCD码与非压缩BCD码的区别:压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如00001000B表示十进制数8.23:3819例4-2设有16位二进制数存放在内部RAM的50H及51H单元中,要求将其算术左移一位(即原数各位均向左移1位,最低位移入0)后仍存放在原单元。试编制相应的程序。---顺序结构实例BIHR:CLRC;Cy清零MOVA,51H;低8位向左环移1位RLCAMOV51H,AMOVA,50H;高8位向左环移1位RLCAMOV50H,A23:3820二、分支程序程序分支是通过条件转移指令实现的,即根据条件对程序的执行进行判断、满足条件则进行程序转移,不满足条件就顺序执行程序。分支程序又分为单分支、双分支和多分支结构。多分支程序是首先把分支程序按序号排列,然后按序号值进行转移。在89C51指令系统中,通过条件判断实现单分支程序转移的指令有:JZ、JNZ、CJNE、DJNZ等。此外还有以位状态作为条件进行程序分支的指令,如JC、JNC、JB、JNB、JBC等。使用这些指令可以完成0、1、正、负,以及相等、不相等作为各种条件判断依据的程序转移。23:3821编写程序,根据x的值求y的值,并放回原单元中。---分支结构实例例4-3设变量x以补码形式存放在片内RAM的30H单元中,变量y与x的关系是:23:3822---分支结构实例START:MOVA,30HJZNEXT;x=0,转移ANLA,#80H;保留符号位JZED;x0,转移MOVA,#05H;x0,不转移ADDA,30HMOV30H,ASJMPEDNEXT:MOV30H,#20HED:SJMP$程序如下:23:3823例4-4128种分支转移程序。功能:根据入口条件转移到128个目的地址。入口:(R3)=转移目的地址的序号00H→7FH。出口:转移到相应于程序入口。---分支结构实例散转指令转向0分支转向1分支转向n-1分支转向n分支K=0K=1K=n-1K=n┅┅┅23:3824JMP-128:MOVA,R3RLAMOVDPTR,#JMPTABJMP@A+DPTRJMPTAB:AJMPROUT00;128个子程序首址AJMPROUT01…AJMPROUT7F23:3825三、循环程序在程序运行时,有时需要连续重复执行某段程序,可以使用循环程序。其结构包括四部分:1、置循环初值2、循环体(循环工作部分)3、修改控制变量4、循环控制部分23:38261、置循环初值对于循环程序中所使用的工作单元,在循环开始时应置初值。例如,工作寄存器设置计数初值,累加器A清0,以及设置地址指针、长度等。23:38272、循环体(循环工作部分)重复执行的程序段部分,分为循环工作部分和循环控制部分。循环控制部分每循环一次,检查结束条件,当满足条件时,就停止循环,往下继续执行其他程序23:38283、修改控制变量在循环程序中,不许给出循环结束条件。常见的是计数循环,当循环了一定的次数后,就停止循环。在单片机中,一般用一个工作寄存器Rn作为计数器,对该计数器赋初值作为循环次数。每循环一次,计数器的值减1,即修改循环控制变量,当计数器的置件为0时,就停止循环。23:38294、循环控制部分根据循环结束条件,判断是否结束循环。89C51可采用DJNZ指令来自动修改控制变量并能结束循环。23:3830置初值循环体循环修改循环控制退出循环未完完(a)置初值循环体循环修改循环控制退出循环未完完(b)循环组织方式流程图23:3831例4-5将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buf的存储区域内,直到发现“$”字符停止传送。本例结束条件为找到“$”停止传送。程序如下:MOVR0,#DATA;源数据区首地址MOVDPTR,#BUF;目的数据区首地址LOOP0:MOVA,@R0;取数据CJNEA,#24H,LOOP1;判断是否为$字符SJMPLOOP2;是$,转结束LOOP1:MOVX@DPTR,A;不是$,执行传送INCR0;修改源地址INCDPTR;修改目的地址SJMPLOOP0;传送下一个数据LOOP2:SJMP$---循环结构实例23:3832例4-6设89C51单片机使用12MHz晶振(机器周期T为lµs),试计算延时时间。ORG4000HDEYPRG:MOVR5,#80H;1个机器周期LOOP1:MOVR6,#0FFH;1个机器周期LOOP2:DJNZR6,LOOP2;2个机器周期DJNZR5,LOOP1;2个机器周期NOP;1个机器周期RET;2个机器周期---循环结构实例23:3833四、查表程序查表程序是一种常用的程序,它广泛使用于LED显示器控制、打印以及数据补偿、计算、转换等功能程序中,具有程序简单、执行速度快等优点。查表,就是根据变量x在表格中查找y,使y=f(x)。例4-7试编写程序,将16进制数(0-F)转换成ASCII码。分析:16进制0~9的ASCII码为30~39H,A~F的ASCII码为41H~46H,ASCII码表的首地址为ASCTAB。入口:HEX单元的低四位存放16进制数。出口:转换后的ASCII码送回HEX单元。----其它应用程序实例23:3834在这个程序中,查表指令MOVCA,@A+PC到表格首地址有两条指令,占用3个地址空间,故变址调整为加3。4.2.4查表程序ORG0200HHEXEQU33HHEXASC:MOVA,HEXANLA,#0FHADDA,#03H;变址调整MOVCA,@A+PCMOVHEX,ARETASCTAB:DB30H,31H,32H,33HDB34H,35H,36H,37HDB38H,39H,41H,42HDB43H,44H,45H,46HEND----其它应用程序实例23:3835五、子程序同一个程序中,往往有许多地方都需要执行同样的一项任务,这时可以对这项任务进行独立的编写,形成一个子程序。在原来的主程序中需要执行该任务时,调用该子程序,执行完后又返回主程序,继续以后的操作,这就是所谓的子程序结构。在程序设计过程中,适当地使用子程序具有以下优点:1)不必重复编写同样的程序,提高了编码的效率。2)缩短源程序和目标程序的长度,节省程序存储空间。3)使程序模块化、通用化,便于阅读、交流和共享。4)便于分块调试。----其它应用程序实例23:3836在子程序调用过程中须解决以下两个方面的问题:1)保护现场和恢复现场。2)调用程序与被调用程序之间的
本文标题:第4章__汇编语言程序设计知识1
链接地址:https://www.777doc.com/doc-3362571 .html