您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 第4章89C51单片机汇编语言程序设计知识2010
第四章汇编语言程序设计及知识§4.1编程的步骤、方法和技巧§4.2汇编语言源程序的编辑和汇编§4.1编程的步骤、方法和技巧§4.1.1编程的步骤一、分析问题二、确定算法三、画程序流程图四、编写程序§4.1.2编程的方法和技巧一、模块化的程序设计方法二、编程技巧§4.1.3汇编语言程序的基本结构一、顺序程序二、分支程序三、循环程序一、分析问题对需要解决的问题进行分析,以求对问题由正确的理解。如:解决问题的任务是什么?工作过程?现有的条件,已知数据,对运算的精度和速度方面的要求?设计的硬件结构是否方便编程?§4.1.1编程的步骤二、确定算法算法是如何将实际问题转化成程序模块来处理。在编程以前,先要对几种不同的算法进行分析、比较,找出最适宜的算法。三、画程序流程图程序流程图是使用各种图形、符号、有向线段等来说明程序设计过程的一种直观的表示。流程图步骤分得越细致,编写程序是也越方便。画流程图是程序结构设计是采用的一种重要手段。一个系统软件有总的流程图(主程序框图)和局部的流程图。流程图常采用的图形和符号。椭圆框或桶形框:表示程序的开始或结束。矩形框:表示要进行的工作。菱形框:表示要判断的事情,菱形框内的表达式表示要判断的内容。圆圈:表示连接点指向线:表示程序的流向四、编写程序用89C51汇编语言编写的源程序行(一条语句)包括四个部分,也叫四个字段:〔标号:〕〔操作码〕〔操作数〕;〔注释〕每个字段之间要用分隔符分隔,而每个字段内部不能使用分隔符。可以用作分隔符的符号:空格“”、冒号“:”、逗号“,”、分号“;”等。例:LOOP:MOVA,#00H;立即数00H→A标号标号是用户定义的符号地址。一条指令的标号是该条指令的符号名字,标号的值是汇编这条指令时指令的地址。标号由以英文字母开始的1~8个字母或数字组成,以冒号“:”结尾。标号可以由赋值伪指令赋值,如果没有赋值,汇编程序把存放该指令目标码第一字节的存储单元的地址赋给该标号,所以,标号又叫指令标号。INCAJMPBRANCH1…BRANCH1:操作码操作码是必不可少的。它用一组字母符号表示指令的操作码。在89C51中,由89C51的指令助记符组成。操作数汇编语言指令可能要求或不要求操作数,所以这一字段可能有也可能没有。如NOP指令不要求操作数。若有两个操作数,操作数之间用逗号“,”分开。操作数包括的内容有:(1)工作寄存器:由PSW.3和PSW.4规定的当前工作寄存器区中的R0~R7。(2)特殊功能寄存器:21个SFR的名字。(3)标号名:赋值标号—由汇编指令EQU等赋值的标号;指令标号—指令标号指示的指令的第一字节地址是该标号的值。(4)常数:可用二进制(B)、十进制、十六进制(H),若常数以字符开头,前面加0。注释注释部分不是汇编语言的功能部分,只是用于增加程序的可读性。良好的注释是汇编语言程序编写中的重要组成部分。(5)$:用来表示程序计数器的当前值。如:JNBTF0,$;如果TF0为0,则一直执行该指令。(6)表达式:汇编时,计算出表达式的值填入目标。如:MOVA,M+1;前提条件是M已在某处作过定义。一、模块化的程序设计方法§4.1.2编程的方法和技巧1、程序功能模块化的优点单个模块结构的程序功能单一,易于编写、调试和修改。便于分工,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。程序可读性好,便于功能扩充和版本升级。对程序的修改可局部进行,其它部分可以保持不变。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。2、划分模块的原则每个模块应具有独立的功能,能产生一个明确的结果,即单模块的功能高内聚性。模块之间的控制耦合应尽量简单,数据耦合应尽量少,即模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换频繁程度。模块长度适中。20条~100条的范围较合适。二、编程技巧1、尽量采用循环结构和子程序。2、尽量少用无条件转移指令。3、对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出),即保护现场。4、在中断处理程序中,除了要保护处理程序中用到的寄存器外,还要保护标志寄存器。5、用累加器传递入口参数或返回参数比较方便,在子程序中,一般不必把累加器内容压入堆栈。一、顺序程序顺序程序是最简单的程序结构,即顺序结构。程序按顺序一条一条地执行指令。§4.1.3汇编语言程序的基本结构二、分支程序程序分支是通过条件转移指令实现的,即根据条件对程序的执行进行判断、满足条件则进行程序转移,不满足条件就顺序执行程序。分支程序又分为单分支和多分支结构。多分支程序是首先把分支程序按序号排列,然后按序号值进行转移。在MCS-51指令系统中,通过条件判断实现单分支程序转移的指令有:JZ、JNZ、CJNE、DJNZ等。此外还有以位状态作为条件进行程序分支的指令,如JC、JNC、JB、JNB、JBC等。使用这些指令可以完成0、1、正、负,以及相等、不相等作为各种条件判断依据的程序转移。例4-1:片内RAMONE和TWO两个单元中存有两个无符号数,将两个数中的小者存入30H单元。程序如下:MOVA,ONECJNEA,TWO,BIGSJMPSTOREBIG:JCSTOREMOVA,TWOSTORE:MOV30H,A例4-2:128种分支转移程序。功能:根据入口条件转移到128个目的地址。入口:(R3)=转移目的地址的序号00H~7FH。出口:转移到相应分支程序入口。128个分支程序首址JMP_128:MOVA,R3RLAMOVDPTR,#JMPTABJMP@A+DPTRJMPTAB:AJMPROUT00AJMPROUT01┇┇AJMPROUT7F说明:此程序要求128个转移目的地址(ROUT00~ROUT7FH)必须驻留在与绝对转移指令AJMP相同的一个2KB存储区内。RL指令对变址部分乘以2,因为每条AJMP指令占两个字节。图4-1多分支程序结构散转指令转向0分支转向1分支转向n-1分支转向n分支K=0K=1K=n-1K=n┅┅┅三、循环程序在程序运行时,有时需要连续重复执行某段程序,可以使用循环程序。其结构包括四部分:1、置循环初值对于循环程序中所使用的工作单元,在循环开始时应置初值。例如,工作寄存器设置计数初值,累加器A清0,以及设置地址指针、长度等。2、循环体(循环工作部分)重复执行的程序段部分,分为循环工作部分和循环控制部分。循环控制部分每循环一次,检查结束条件,当满足条件时,就停止循环,往下继续执行其他程序。3、修改控制变量在循环程序中,必须给出循环结束条件。常见的是计数循环,当循环了一定的次数后,就停止循环。在单片机中,一般用一个工作寄存器Rn作为计数器,对该计数器赋初值作为循环次数。每循环一次,计数器的值减1,即修改循环控制变量,当计数器的置件为0时,就停止循环。4、循环控制部分根据循环结束条件,判断是否结束循环。89C51可采用DJNZ指令来自动修改控制变量并能结束循环。置初值循环体循环修改循环控制退出循环未完完(a)置初值循环体循环修改循环控制退出循环未完完(b)图4-2循环组织方式流程图例4-3:统计字串长度。内存从STRING开始有一字串,该字串以$结束,试统计该字串长度,结果存于NUM单元中。(条件控制循环结构)程序如下:NUMDATA20HSTRINGDATA21HCLRAMOVR0,#STRINGLOOP:CJNE@R0,#24H,NEXTSJMPCOMPNEXT:INCAINCR0SJMPLOOPCOMP:MOVNUM,A软件延时程序:当单片机的时钟确定后,每条指令的指令周期是确定的。因此,根据程序执行所用的总的机器周期数,可以较准确地计算程序执行完所用的时间。如:DELAY:MOVR2,#DATADELAY:DJNZR2,DELAY1RET例4-4:片内RAM30H单元开始有10个字节的二进制数。编一子程序,求它们的和(设和小于256),将和存入20H单元中。ORG1000HMOVR0,#30HCLRAMOVR7,#10CLRCLOOP:ADDCA,@R0INCR0DJNZR7,LOOPMOV20H,ARETORG1000HMOVR0,#30HMOVA,@R0MOVR7,#09CLRCLOOP:INCR0ADDCA,@R0DJNZR7,LOOPMOV20H,ARET§4.2.1源程序编辑在微型计算机上,借助编辑软件,编写或修改汇编语言源程序。如行编辑或屏幕编辑软件。§4.2汇编语言源程序的编辑和汇编§4.2.2源程序的汇编汇编:将汇编语言源程序转换为机器码表示的目标程序的过程。源程序(汇编语言)目标码(机器语言)汇编(汇编程序)反汇编(汇编程序)§4.2.3伪指令(指示性语句)伪指令不是真正的指令,无对应的机器码,在汇编时不产生目标程序,只是用来对汇编过程进行某种控制。ORG汇编起始命令格式:ORG16位地址功能:规定该伪指令后面程序的汇编地址,即汇编后生成的目标程序存放的起始地址。例如:ORG2000HSTART:MOVA,#64H┇规定了START的地址是2000H,又规定了汇编后的第一条指令码从2000H开始存放。END汇编结束指令格式:END功能:通知汇编程序结束汇编。在END之后所有的汇编指令均不予以处理。EQU赋值命令格式:字符名称EQU项(数或汇编符号)功能:把“项”赋给“字符名称”。注意:字符名称不等于标号(其后没有冒号);其中的项,可以是数,也可以是汇编符号。EQU赋值过的符号名称可以用作数据、代码地址、位地址或一个立即数。可以是8位的,也可以是16位的。例如:EQU赋值命令例1:AAEQUR1MOVA,AA;AA代表工作寄存器R1例2:A10EQU10DELYEQU07EBHMOVA,A10;A10作为片内的一个直接地址LCALLDELY;DELY作为一个16位子程序的入口地址DATA数据地址赋值命令格式:字符名称DATA表达式功能:与EQU类似,但有以下差别:1、EQU定义的字符名必须先定义后使用,而DATA定义的字符名可以后定义先使用。2、用EQU伪指令可以把一个汇编符号赋给一个名字,而DATA只能把数据地址赋给字符名。3、DATA语句可以把一个表达式的值赋给字符名称,其中的表达式应是可求值的。4、DATA伪指令在程序中用来定义数据地址。DB定义字节命令格式:DB(项或项表)功能:通知汇编程序从当前ROM地址开始,保留一个字或字节串的存储单元,并存入DB后的数据。注意:项或项表可以是一个字节,用逗号隔开的字节串或括在单引号中的ASCII字符串。例如:DB定义字节命令ORG2000HDB0A3HLIST:DB26H,03HSTR:DB‘ABC’┇经汇编后(2000H)=A3H,(2001H)=26H,(2002H)=03H,(2003H)=41H,(2004H)=42H,(2005H)=43H,(41H,42H,43H分别为A,B,C的ASCII码)DW定义字命令格式:DW16位数据项或项表功能:把DW后的16位数据项或项表从当前地址连续存放。每项数值为16位二进制数,高8位先放,低8位后存放。DW用于定义一个地址表。例如:ORG1500HTABLE:DW7234H,8AH,10H┇经汇编后(1500H)=72H,(1501H)=34H,(1502H)=00H,(1503H)=8AH,(1504H)=00H,(1505H)=10H,DS定义存储空间命令格式:DS表达式功能:在汇编时,从指定地址开始保留DS之后表达式的值所规定的存储单元以备后用。例如:ORG1000HDS08HDB30H,8AH汇编后,从1000H保留8个单元,然后从1008H按DB命令给内存赋值,即(1008H)=30H,(1009H)=8AHBIT位地址符号命令格式:字
本文标题:第4章89C51单片机汇编语言程序设计知识2010
链接地址:https://www.777doc.com/doc-3151063 .html