资源描述
,单片机原理及接口技术,单击以编辑,母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单片机原理及接口技术,单击以编辑,母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,4,章 汇编语言程序设计知识,4.1,编程的,步骤,、,方法,和,技巧,4.2,汇编语言源程序的,编辑,和,汇编,3/2/2026,4.1,编程的步骤、方法和技巧,4.1.1,编程的,步骤,4.1.2,编程的,方法,和,技巧,4.1.3,汇编语言程序的,基本结构,3/2/2026,4.1.1,编程步骤,一、分析问题,二、确定算法,三、画程序流程图,四、编写程序,3/2/2026,一、分析问题,对需要解决的问题进行,分析,,以求对问题有正确的,理解,。,解决问题的,任务,是什么?,工作过程,?,现有的,条件,,已知,数据,,对运算的,精度,和,速度,方面的要求?,设计的,硬件结构,是否方便编程?,3/2/2026,二、确定算法,算法:,是如何将,实际问题,转化成,程序模块,来处理。,在编程以前,先要对,几种,不同的算法进行分析、比较,找出,最适宜,的算法,3/2/2026,三、画程序流程图,程序流程图,:是使用各种,图形、符号、有向线段,等来,说明程序设计过程,的一种,直观的表示,。,流程图步骤分得,越细致,,编写程序是也,越方便,。,画流程图是程序结构设计是采用的,一种重要手段,。,一个系统软件有,总的流程图,(,主程序框图,)和,局部的流程图,。,流程图,常采用,的,图形,和,符号,。,3/2/2026,椭圆框,或,桶形框,:表示程序的,开始,或,结束,。,矩形框,:表示要进行的,工作,。,菱形框,:表示要,判断,的事情,菱形框内的表达式表示要,判断的内容,。,圆圈,:表示,连接点。,指向线,:,表示程序的,流向。,3/2/2026,四、编写程序,用,89C51,汇编语言编写的,源程序行,(,一条语句,)包括,四个部分,,也叫,四个字段,:,标号,:,操作码,操作数,;,注释,每个字段之间要用,分隔符,分隔,而每个字段内部不能使用分隔符。,可以用作分隔符的符号,:,空格,“,”,、,冒号,“,:,”,、,逗号,“,,,”,、,分号,“,;,”,等。,例,:,LOOP,:,MOV,A,,,#00H ;,立即数,00HA,3/2/2026,标号,标号:,是用户定义的,符号地址,。,一条指令的标号,是该条指令的,符号名字,,,标号的值,是汇编这条指令时,指令的地址,。,标号由以,英文字母开始,的,1,8,个,字母,或,数字,组成,,以冒号,“,:,”,结尾,。,标号可以,由赋值伪指令赋值,,如果,没有赋值,,汇编程序把,存放该指令目标码第一字节的存储单元的地址,赋给该标号,所以,标号又叫,指令标号,。,3/2/2026,操作码,操作码是,必不可少,的。,它,用一组字母符号表示,指令的操作码。,在,89C51,中,由,89C51,的,指令助记符,组成。,3/2/2026,操作数,汇编语言指令可能要求或不要求操作数,所以这一字段,可能有也可能没有,。,若有两个操作数,,操作数之间用逗号,“,”,分开,操作数,包括的内容,有:,(1),工作寄存器,:由,PSW.3,和,PSW.4,规定的当前工作寄存器区中的,R0,R7,。,(2),特殊功能寄存器,:,21,个,SFR,的名字。,3/2/2026,操作数,(3),标号名,:,赋值标号,:由汇编指令,EQU,等赋值的标号;,指令标号,:指令标号指示的,指令的第一字节地,址,是该标号的值。,(4),常数,:可用二进制,(B),、十进制、十六进制,(H),,若常数以字符开头,前面加,0,。,(5),$,:用来表示,程序计数器的当前值,。,(6),表达式,:汇编时,计算出表达式的值填入目标码。,3/2/2026,注释,注释部分,不是,汇编语言的,功能部分,,只是,用于增加程序的可读性,。,良好的注释是汇编语言程序编写中的重要组成部分。,3/2/2026,4.1.2,编程的方法和技巧,一、,模块化,的程序设计方法,二、编程,技巧,3/2/2026,一、模块化的程序设计方法,1,、程序功能模块化的,优点,2,、划分模块的,原则,3/2/2026,1,、程序功能模块化的,优点,单个模块结构的程序功能单一,,易于编写、调试和修改,。,便于分工,,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。,程序,可读性好,,便于功能扩充和版本升级。,对程序的修改可局部进行,,其它部分可以保持不变。,对于使用频繁的子程序,可以建立子程序库,,便于多个模块调用。,3/2/2026,2,、划分模块的,原则,每个模块应具有,独立的功能,,能产生一个,明确的结果,,即,单模块的功能,高内聚性,。,模块之间的,控制耦合应尽量简单,,,数据耦合应尽量少,,即,模块间的,低耦合性,。,控制耦合,:指模块进入和退出的条件及方式,,数据耦合,:指模块间的信息交换方式、,交换量的多少、交换频繁程度。,模块长度适中,。,20,条,100,条的范围较合适。,3/2/2026,二、编程技巧,1,、,尽量采用循环结构和子程序,。,2,、,尽量少用无条件转移指令,。,3,、对于通用的,子程序,,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出),即,保护现场,。,4,、在,中断处理程序,中,除了要保护处理程序中用到的寄存器外,还,要保护标志寄存器,。,5,、用,累加器,传递入口参数或返回参数比较方便,在子程序中,,一般不必把累加器内容压入堆栈,。,3/2/2026,4.1.3,汇编语言程序的,基本结构,一、顺序程序,二、分支程序,三、循环程序,四、子程序,3/2/2026,一、顺序程序,顺序程序是,最简单,的程序结构,,即顺序结构。,程序,按顺序一条一条地执行,指令,。,P92,例,3/2/2026,START:MOV R0,#00H,MOV R1,#00H,MOV R2,#00H,MOV R3,#00H,MOV P1,#00H,MOV R4,#FFH,MOV R5,#FFH,MOV 30H,#00H,MOV 40H,#00H,END,3/2/2026,二、分支程序,程序分支是,通过条件转移指令实现的,,即根据条件对程序的执行进行判断、,满足条件,则进行程序转移,,不满足条件,就顺序执行程序。,分支程序又分为,单分支,和,多分支结构,。,多分支程序,:首先把分支程序,按序号排列,,,然后,按序号值进行转移,。,多分支转移结构,:,P97,图,4-1,3/2/2026,图,4-1,多分支程序结构,散转指令,转向,0,分支,转向,1,分支,转向,n-1,分支,转向,n,分支,K=0,K=1,K=n-1,K=n,3/2/2026,二、分支程序,在,89C51,指令系统中,通过条件判断,实现单分支程序转移的指令,有:,JZ,、,JNZ,、,CJNE,、,DJNZ,等。此外还有,以位状态作为条件进行程序分支的指令,,如,JC,、,JNC,、,JB,、,JNB,、,JBC,等。使用这些指令可以完成,0,、,1,、正、负,以及相等、不相等作为各种条件判断依据的程序转移。,P97,例,4-6,所示。,3/2/2026,JMP_128,:,MOV,A,,,R3,RL,A,MOV,DPTR,,,#JMPTAB,JMP,A+DPTR,JMPTAB,:,AJMP ROUT00,AJMP,ROUT01,AJMP,ROUT7F,128,个子程序首址,例,4-6,:,128,种分支转移程序。,程序框图,:,P97,图,4-1,功能,:根据入口条件转移到,128,个目的地址。,入口,:,(R3)=,转移目的地址的序号,00H,7FH,。,出口,:转移到相应子程序入口。,3/2/2026,说明:此程序要求,128,个转移目的地址(,ROUT00,ROUT7FH,),必须驻留在与绝对转移,指令,AJMP,相同的一个,2KB,存储区内。,RL,指令,对变址部分乘以,2,,因为每条,AJMP,指令,占两个字节。,3/2/2026,三、循环程序,在程序运行时,有时需要,连续重复,执行某段程序,可以使用循环程序。其,结构,包括四部分:,1,、置循环初值,2,、循环体(循环工作部分),3,、修改控制变量,4,、循环控制部分,3/2/2026,1,、置循环初值,对于循环程序中所使用的,工作单元,,在循环开始时应,置初值,。,例,:工作寄存器设置计数初值,,累加器,A,清,0,,,设置地址指针、长度等。,3/2/2026,2,、循环体(循环工作部分),重复执行的程序段部分,,分为,循环,工作,部分,和,循环,控制,部分,。,循环控制部分,每循环一次,检查结束条件,当,满足条件,时,就停止循环,往下继续执行其他程序,3/2/2026,3,、修改控制变量,在循环程序中,必须给出,循环结束条件,。,常见的是计数循环,,当循环了一定的次数后,就停止循环。,在单片机中,,一般用一个工作寄存器,Rn,作为计数器,,对该计数器赋初值作为,循环次数,。每循环一次,计数器的值,减,1,,即修改循环控制变量,当计数器的,值,减,为0时,,就,停止循环,。,3/2/2026,4,、循环控制部分,根据循环结束条件,判断是否结束循环,。,89C51,可,采用,DJNZ,指令,来自动修改控制变量并能结束循环。,2,种循环组织方式:,P101,图,4-6,3/2/2026,置初值,循环体,循环修改,循环控制,退出循环,未完,完,(a),置初值,循环体,循环修改,循环控制,退出循环,未完,完,(b),图,4-2,循环组织方式流程图,3/2/2026,例,4-11,软件延时,P101,1),采用循环程序进行软件延时子程序,DELAY:MOV R2,,,#data ;,预置循环控制常数,DELAY1:DJNZ R2,,,DELAY1,;,当,(R2)0,时,转向本身,RET,3/2/2026,2),采用双重循环的延时子程序,TIME:MOV R1,,,#0FAH ;1,个机器周期,L1:MOV R0,,,#0FFH ;1,个机器周期,W1,:,DJNZ R0,,,W1 ;2,个机器周期,DJNZ R1,,,L1 ;2,个机器周期,NOP ;1,个机器周期,NOP ;1,个机器周期,RET ;2,个机器周期,总的机器周期数,N=1+(1+2255+2)250+1+1+2,延时时间,t=NT=1282552=256510,s=256.51ms,3/2/2026,4.2,汇编语言源程序的,编辑,和,汇编,4.2.1,源程序,编辑,4.2.2,源程序的,汇编,4.2.3,伪指令,3/2/2026,4.2.1,源程序,编辑,在微型计算机上,,借助编辑软件,,,编写,或,修改,汇编语言,源程序,。如行编辑或屏幕编辑软件。,3/2/2026,4.2.2,源程序的汇编,汇编,:将汇编语言,源程序,转换为机器码表示的,目标程序,的过程。对单片机有:,一、手工汇编,二、机器汇编,三、反汇编,3/2/2026,一、手工汇编,通过手工方式,查指令编码表,(P307,附录,A,指令表,),逐个把,助记符,指令,“,翻译,”,成,机器码,,然后把得到的机器码程序,键入单片机,,进行,调试,和,运行,。,手工汇编的,缺点,:,1,、偏移量的计算,麻烦,且,容易出错,2,、,程序的修改,会引起后面指令地址的变化,转移指令的偏移量也要,重新计算,。,3/2/2026,二、机器汇编,机器汇编是,在计算机上使用交叉汇编程序,进行源程序的汇编。汇编工作,由机器自动完成,,最后得到以机器码表示的,目标程序,。,汇编完成后,再由,PC,机把生成的目标程序,加载,到,用户样机上,。,3/2/2026,三、反汇编,将,二进制机器语言程序,翻译成,汇编语言程序,的过程称,反汇编,。,汇编和反汇编的过程:,P108,图,4-10,源程序,(汇编语言),目标码,(机器语言),汇编(汇编程序),反汇编,(汇编程序),图,4-10,汇编和反汇编过程,3/2/2026,4.2.3,伪指令,伪指令,:由,英文字母,表示的,汇编命令,。,伪指令,不是真正的指令,,,无对应的机器码,,在汇编时,不产生目标程序,,只是用来对汇编过程进行,某种控制,。,89C51,有,8,个伪指令,:,ORG,END,EQU,DATA,DB,DW,DS,BIT,3/2/2026,1.ORG,汇编起始命令,格式,:,ORG 16,位地址,功能,:规定该伪指令后面程序的汇编地址,,即汇编后生成目标程序存放的起始地址。,例,:,ORG 2000H,START,:,MOV A,,,#64H,规定了,START,的地址,是,2000H,,,规定了,汇编后的第一条指令码,从,2000H,开始存放,3/2/2026,2.END,汇编结束指令,格式,:,END,功能,:通知汇编程序,结束汇编,。,在,END,之后所有的汇编指令均不予以处理。,3/2/2026,3.EQU,赋值命令,格式,:字符名称,EQU,项,(,数或汇编符号,),功能,:把,“,项,”,赋给,“,字符名称,”,。,注意,:,字符名称不等于标号,(其后没有冒号);其中的,项,,可以是,数,,也可以是,汇编符号,。,EQU,赋值过的符号名,可用作,数据,、,代码地址,、,位地址,或一个,立即数,。可以是,8,位,的,也可以是,16,位,的。,3/2/2026,3.EQU,赋值命令,例,1,:,AA,EQU,R1,MOV,A,,,AA ;AA,代表工作寄存器,R1,例,2,:,A10,EQU,10,DELY,EQU,07EBH,MOV,A,,,A10,;A10,作为片内的一个直接地址,LCALL,DELY,;DELY,作为一个,16,位子程序的入口地址,3/2/2026,4.DATA,数据地址赋值命令,格式,:字符名称,DATA,表达式,功能,:与,EQU,类似,但有以下差别:,1,、,EQU,定义的字符名,必须先定义后使用,,,DATA,定义的字符名,可后定义先使用,。,2,、用,EQU,伪指令,可把一个,汇编符号,赋给一个名字,而,DATA,只能把,数据,赋给字符名,。,3,、,DATA,语句,可把一个表达式的值赋给字符名称,其中的表达式应是可求值的。,DATA,伪指令在程序中用来,定义数据地址。,3/2/2026,5.DB,定义,字节,命令,格式,:,DB,(项或项表),功能,:通知汇编程序,从当前,ROM,地址开始,,,保留一个字节或字节串的存储单元,,并,存入,DB,后的数据,。,注意,:项或项表可以是一个,字节,,用逗号隔开的,字节串,或括在单引号中的,ASCII,字符串,。,3/2/2026,例:,ORG,2000H,DB,0A3H,LIST,:,DB,26H,,,03H,STR,:,DB,ABC,经汇编后(,2000H,),=0A3H,,,(,2001H,),=26H,,,(,2002H,),=03H,,,(,2003H,),=41H,,,(,2004H,),=42H,,,(,2005H,),=43H,,,(,41H,,,42H,,,43H,分别为,A,,,B,,,C,的,ASCII,码),3/2/2026,6.DW,定义,字,命令,格式,:,DW,16,位数据项或项表,功能,:把,DW,后的,16,位数据项,或,项表从当前地址连续存放,。每项数值为,16,位二进制数,高,8,位先放,,,低,8,位后存放,。,DW,用于,定义一个地址表,。,3/2/2026,例,:,ORG,1500H,TABLE,:,DW 7234H,,,8AH,,,10H,经汇编后(,1500H,),=72H,,,(,1501H,),=34H,,,(,1502H,),=,00H,,,(,1503H,),=8AH,,,(,1504H,),=,00H,,,(,1505H,),=10H,,,3/2/2026,7.DS,定义存储空间命令,格式,:,DS,表达式,功能,:在汇编时,从指定地址开始,保留,DS,之后表达式的值所规定的,存储单元,,以备后用。,3/2/2026,DS,定义存储空间命令,例,:,ORG,1000H,DS,08H,DB,30H,,,8AH,汇编后,从,1000H,保留,8,个单元,,,然后从,1008H,按,DB,命令给内存赋值,,即(,1008H,),=30H,(,1009H,),=8AH,3/2/2026,8.BIT,位地址符号命令,格式,:字符名,BIT,位地址,功能,:把,BIT,后的,位地址值赋给字符名,。其中,字符名不是标号,,其后没有冒号,但字符名是必须的。,例,:,A1,BIT P1.0,A2,BIT 02H,汇编后,,P1,口第0位的位地址,90,H,就赋给了,A1,,,而,A2,的值则为,02,H,。,3/2/2026,请继续学习第五章,3/2/2026,
展开阅读全文