《嵌入式系统概论-单片机基础》单片机之汇编语言.ppt

上传人:za****8 文档编号:13195372 上传时间:2020-06-07 格式:PPT 页数:35 大小:411.01KB
返回 下载 相关 举报
《嵌入式系统概论-单片机基础》单片机之汇编语言.ppt_第1页
第1页 / 共35页
《嵌入式系统概论-单片机基础》单片机之汇编语言.ppt_第2页
第2页 / 共35页
《嵌入式系统概论-单片机基础》单片机之汇编语言.ppt_第3页
第3页 / 共35页
点击查看更多>>
资源描述
嵌入式系统概论,单片机基础,汇编语言程序设计,教学目的:熟悉80C51系列单片机的汇编语言,能够熟练编写汇编语言源程序。教学重点:常用汇编语言程序设计方法。教学难点:分支程序、散转程序与子程序的设计,程序设计语言,机器语言是一种用二进制代码“0”和“1”表示指令和数据最原始的程序设计语言,是计算机唯一能够识别和执行的语言。计算机能够快速识别立即执行。汇编语言是用助记符表示的面向机器程序设计语言,比机器语言直观、易懂、易用且便于记忆。汇编语言在交由计算机执行之前,必须将其翻译成机器语言,这一翻译过程称为“汇编”。高级语言是一种面向过程且独立于计算机硬件结构的通用计算机语言。高级语言同样需要翻译成机器语言,这一过程称为“编译”或“解释”,这一编译或解释的程序称为“编译程序”或“解释程序”。高级语言功能强,但用较多的存储空间,执行时间长,故不适用于高速实时控制。,汇编语言规范,汇编语言由四部分组成标号:操作码,操作数;注释标号段:以字母开头的1-8个字母和数字串组成,不能用助记符、伪指令和寄存器名,标号只有在需要时才设置。操作码段:是指令或伪指令助记符,用来表示指令的操作性质,在指令中是必不可少的。操作数段:给出参加运算(或其它操作)的数据或数据地址。可使用二(B)、十(D)、十六(H)进制码.也可用标号及表达式表示。注释段:是本指令执行目的和所起作用的说明。它不参加汇编。例HY1:MOVA,#08H;#08HA(表示将立即数08H送到累加器A中),80C51汇编程序设计中常用的伪指令,在汇编程序对汇编语言编写的源程序进行汇编时,有一些控制汇编用的特殊指令不属于指令系统,不产生机器代码,称为“伪指令”。为编程提供方便。1、ORG(Origin)汇编起始指令:用于规定目的程序在程序存储器中存放的起始地址。格式如下:标号操作码操作数ORG表达式(exp)注exp必须是16位的地址值2、END汇编结束指令:表示程序已结束。3、EQU(Equate)赋值指令:把操作数段中的地址或数据赋值给标号,格式如下:标号操作码操作数字符名称EQU数或汇编符号例AAEQUR1;R1与AA等值则MOVA,AA指令与MOVA,R1指令结果相同。,80C51汇编程序设计中常用的伪指令,4、DB(DefineByte)定义字节(*8bit)指令:定义程序存储器中存放的若干个字节的数值或ASCII码字符,每个数或字符之间用(,)隔开,表示ASCII码时需用()或(“”)表示8位常数表,格式如下:操作码操作数DB字节常数或ASCII字符例ORG1000HDB76H,73,C,B,OACH则(1000H)76H(1001H)49H(1002H)43H(1003H)42H(1004H)0ACH5、DW(DefineWord)定义字(*16bit)指令:定义程序存储器中存放的若干个字(16位:先存高8位(PC低地址),后存低8位(PC高地址)的数据或ASCII码字符,格式如下:操作码操作数DW字常数或ASCII字符例ORG2200HDW1246H,7BH,10则(2200H)12H(2201H)46H(2202H)00H(2203H)7BH(2204H)00H(2205H)0AH,80C51汇编程序设计中常用的伪指令,6、BIT定义位地址指令:功能是把位地址赋予所规定的字符名称。格式如下:标号操作码操作数字符名称BIT位地址例ABCBITP1.0Q4BITP2.2则汇编后,位地址P1.0,P1.2分别赋给变量ABC和Q4。7、DATA定义标号数值伪指令:将表达式指定的数据地址赋予规定的字符名称,该指令与EQU指令相似,只是,可先使用后定义,放于程序开头、结尾均可。其功能是给标号段中的标号赋予数值,格式如下:标号操作码操作数字符名称DATA表达式例MNDATA2000H汇编后,MN的值为2000H8、DS定义存储空间指令:其功能是从指定地址开始保留DS之后表达式的值所规定的存储单元以备使用,格式如下:操作码操作数DS表达式例ORG500HDS10HDB4BH,FDH汇编后,从500H开始保留16个单元不赋值,然后从511H开始给存储器赋值,(511H)=4BH,(512H)=FDH.,汇编可分成两种:人工汇编机器汇编机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。,汇编,机器语言目标程序,汇编语言源程序,汇编程序,汇编,机器语言目标程序,汇编语言源程序,人工查指令机器码表,汇编语言及汇编过程,顺序程序设计,顺序结构程序是基本程序。程序按编写的顺序依次往下执行每一条指令,直到最后一条。它能够解决某些实际问题,或成为复杂程序的子程序。例:将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。注意ASCII码09为30H39H。解:采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。,顺序程序设计,源程序如下:地址机器码周期数源程序.ORG0000H22H0000H0202003LJMPMAIN21HMAIN:20H200H78221MOVR0,22H.202H76001MOVR0,00H.204HE5201MOVA,20HR022H206HD61XCHDA,R0;A和R0的低4位互换207H4322303ORL22H,#30H20AHC41SWAPA;A的高低4位互换20BH44301ORLA,30H20DHF5211MOV21H,A20FH80FE2SJMP$;循环等待END,将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。注意ASCII码09为30H39H。,循环程序设计,处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程序,使程序缩短,节省存储单元。循环初态:(初始条件)是设置循环过程中工作单元的初值,例如,设循环次数计数器、地址指针置初值等。循环体:循环体是指重复执行的程序段,完成主要的计算和操作任务。同时包括对指针的修改。循环控制部分:循环控制部分用于控制循环的执行和结束。根据循环次数计数器的状态或循环条件,检查循环是继续循环或退出循环。若在循环体中还包含有循环程序,这种现象叫“循环嵌套”,这样的程序称为“多重循环程序”。在多重循环程序中,只允许外重循环嵌套内重循环,不允许循环体交叉;也不允许从循环程序外部跳入循环程序中。,顺序程序设计,已知:80C51单片机经常使用的晶振为12MHz,要求设计一个软件延时程序,延时时间为10ms。解:延时程序的延时时间主要与两个因素有关,一个是所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数。在本题中已知晶振为12MHz,则可知一个机器周期为1s,可预计采用单重循环是有可能实现1ms的延时的。现根据题意编写源程序如下:,循环程序设计,周期数源程序注释1MOVR0,0AH;10毫秒数R01DL2:MOVR1,MT;1ms延时的预定值MTR1(MTFAH)1DL1:NOP1NOP2DJNZR1,DL1;lms延时循环2DJNZR0,DL2;毫秒数减1,不等于0,继续循环,等于0结束内层循环DL1机器周期个数为(1+1+2),每个机器周期为1s,内层循环一次需4s。若内层循环延时lms,需1000/4=250次,十六进制数为FAH,循环程序设计,ORG200HCLRA;清A作为初始最大值MOVR2,20H;数据个数初值MOVR1,22H;数据存放区首地址LP:CLRC;清进位SUBBA,R1;初始最大值减队列中的数JNCNEXT;小于初始最大值继续MOVA,R1;大于初始最大值,则用此值作为最大值SJMPNEXT1NEXT:ADDA,R1;小于初始最大值,则恢复原最大值NEXT1:INCR1;修改地址指针DJNZR2,LP;依次重复比较,直至R20MOV21H,A;最大值存入21H单元,从22H单元开始有一个无符号数据块,其长度在20H单元。求出数据块中最大值,并存入21H单元,多重循环设计,如果在一个循环程序中嵌套了其他的循环程序,称为多重循环程序。在用软件实现延时时显得特别有用。设计50ms秒延时子程序,使用12MHz晶振时,一个机器周期的时间为1s,执行一条DJNZ指令的时间为2s,我们可以采用双重循环的方法写出延时的LOOP子程序,周期数源程序注释1LOOP:MOVR7,#C8H;2001DEL1:MOVR6,#7CH;1231NOP2DEL:DJNZR6,DEL2DJNZR7,DEL12RET延时时间:t=1+200(1+1+2*123)+2+250000s=50ms,分支程序设计,分支程序的的特点是在程序中是含有转移指令,可根据程序要求,无条件或有条件地改变程序的执行顺序。编写分支结构程序的重在于正确使用转移指令,转移指令有3种,即无条件转移、条件转移、散转。1、无条件转移:程序转移方向是事先安排的,只须给出正确的转移目标地址或偏移量即可。2、条件转移:根据已执行程序对标志位、累加器、内部RAM的某位的影响结果来决定程序的走向。例:JCrel;(C)1:(PC)2relPC(跳转)(C)0:(PC)2PC(顺序执行)在执行此命令之前,必须使用影响位累加器C的指令。3、散转:在80C51单片机中有一条专门的散转指令。,无条件/条件转移程序,例:设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元。Y=3X,X15函数式有3条路径可选,需采用分支程序设计。首先计算2X并暂存R1中,在第2条件中,2X最大值不大于30,故可用一个寄存器,然后根据X值确定Y值。,无条件/条件转移程序,ORG200HMOVA,5AHADDA,5AH;2XAMOVR1,AMOVA,5AH;重新把X装入ACJNEA,#10,L1L1:JCL2;X15CJNEA,#10H,L3;与16比较L3:JNCL4;X15转L4MOVA,R1ADDA,#10;10X15,Y2X10MOVR0,ASJMPL4L2:MOVA,R1ADDA,5AH;X10,Y=3XMOVR0,AL4:MOV5BH,R0;存结果SJMP$END,Y=3X,X15(5AH)=X(5BH)=Y,散转指令JMPA+DPTR,散转指令的操作是把16位数据指针DPTR的内容与累加器A中8位无符号数相加,形成新的目标地址,装入程序计数器PC,此即散转的目的地址。散转程序的设计采用两种不同的方法。固定数据指针DPTR,根据累加器A的内容,转入相应的分支程序。(散转点不超过256个)累加器A清0,根据数据指针DPTR的值决定程序转向地址,DPTR的值可通过查表或其他方法获得。(可达64KB地址空间转移),散转程序设计(采用转移指令表),根据R3的内容,转向各个操作程序。R30,转入OPR0R31,转入OPR1.R3n,转入OPRn解:程序清单如下MOVDPTR,TAB1;跳转表首地址送数据指针MOVA,R3ADDA,R3;R32A(修正变址值)JNCNOAD;判有否进位INCDPH;有进位则加到高字节地址NOAD:JMPADPTR;(A)+(DPTR)PC转向形成的散转地址入口TAB1:AJMPOPR0;转移到OPR0AJMPOPR1.AJMPOPRn注意:各转移指令地址依次相差2字节,所以A中变址值必须乘2修正(AJMP2字节指令;LJMP3字节指令),散转程序设计(采用转向地址表),根据R2的内容,转入对应的操作程序。解:设转移入口OPR0、OPR1.OPRnMOVDPTR,TAB1MOVA,R2ADDA,R2;R22AJNCNOAD;判有否进位C=0跳转,C=1顺序执行INCDPH;有进位C,(DPH)+1DPHNOAD:MOVR3,A;暂存MOVCA,ADPTR;取地址高8位(A)+(DPTR)AXCHA,R3;暂存转移地址高8位INCAMOVCA,A+DPTR;取地址低8位(A)+(DPTR)AMOVDPL,A;置转移地址低8位MOVDPH,R3CLRAJMPADPTR;(A)+(DPTR)PCTAB1DWOPR0;16位转移地址表的首地址DWOPR1.DWOPRn注:DW(DefineWord)定义字(*16bit)指令:定义程序存储器中存放的若干个字(16位:先存高8位(PC低地址),后存低8位(PC高地址),查表程序设计,所谓的“查表法”,就是预先将一些复杂的运算结果,以表格的形式存放在程序存储器中,当用户程序需要用到这些数据时,使用编排好的程序号将其读出,这种程序称为查表程序。用于查表的指令有两条:MOVCA,APC;MOVCA,ADPTR(均为单字节指令)当使用DPTR作为基址寄存器时查表比较简单,查表的步骤分三步基址(表格首地址)送DPTR数据指针;所查表索引值(在表中的位置是第几项)送累加器A;执行查表指令MOVCA,ADPTR,进行读数,查表结果送回累加器A。当使用PC作为基址寄存器时,由于PC本身是一个程序计数器,与指令的存放地址有关,查表时其操作有所不同。查表的步骤也分三步:使用传送指令把所查数据索引值送入累加器A。使用ADDA,#data指令对累加器A进行修正。data值由下式确定。PC+data=数据表首地址其中,PC是MOVCA,A+PC下一条指令的地址。因此,data值实际等于查表指令和数据表格之间的字节数。执行查表指令MOVCA,APC完成查表。注意:MOVCA,A+DPTR指令可以实现64K地址范围内的数据查寻,而MOVCA,A+PC指令只能实现256字节范围内的数据查寻。,规则变量的查表程序设计,如果数据表格中值位单字节,且表格占有的单元数少于256,则查表方法比较简单。例设计一个将16进制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。ORG30H30HMOVA,R031HANLA,0FH;保留低4位33HADDA,2;变址调整35HMOVCA,APC;查表获取ASCII码值36HMOVR0,A37HRET38HTAB:DB30H,31H,32H,33H,34H,35H,36H,37H,38HDB39H,41H,42H,43H,44H,45H,46H,子程序结构与设计,子程序结构是汇编语言中一种重要的程序结构。在一个程序中经常会碰到反复执行某程序段的情况,如果重新书写这个程序段,会使程序变得冗长而杂乱。对此,可以采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用它。这样不但可以提高编制和调试程序的效率,而且可以缩短程序长度,从而节省程序存储空间。要给每个子程序赋一个名字,实际是一个入口地址代号。要正确地传递函数,首先要有入口条件(入口参数),说明进入子程序时处理的数据如何得到(从累加器A、寄存器R0-R7等处);还要有出口条件(出口参数),即处理的结果是如何存放的。注意保护现场和恢复现场。在执行子程序时,可能使用到累加器A或工作寄存器,所以在执行子程序前,应将这些内容保存起来,即保护现场。当子程序执行完,返回到主程序之前,在将这些内容取出送回到累加器A或原来的寄存器中,这一过程称为恢复现场。,子程序调用与返回,主程序调用子程序是通过子程序调用命令“LCALLadd16”和”ACALLadd11”来实现的。前者称为”长调用指令“,给出16位子程序首地址,后者称为”绝对调用指令“,给出的操作数是子程序低11位入口地址,和程序计数器PC高5位合在一起,构成16位转移地址。子程序调用指令功能是将PC中的内容(下一条指令的地址,称为”断点“)压入堆栈(保护断点)。然后将调用地址送入PC,使程序转入子程序的入口地址。子程序的返回是通过返回指令RET实现的。该指令的功能是将堆栈存放的返回地址(即断点)弹出堆栈,并送回到PC中,使程序继续从断点处执行。在主程序中,不希望被子程序更改内容的寄存器在调用前,在主程序中安排压栈指令来保护现场;子程序返回后,再安排弹出指令恢复现场。在需要保护现场的程序中,要正确地设置堆栈指针。,子程序设计,1、子程序的定义子程序名:.;子程序开始RET;子程序结束注:子程序名由用户定义,以字母开头,2、子程序的调用在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。调用子程序的指令:ACALL子程序名:短调用(2KB范围内)LCALL子程序名:长调用(64KB范围内),子程序嵌套,子程序嵌套是指在子程序执行过程中,还可以调用另一个子程序。子程序的嵌套在理论上是无限的,但实际上由于受到堆栈深度的限制嵌套的次数是有限的。子程序调用指令功能是将PC中的内容(下一条指令的地址,称为”断点“)压入堆栈(保护断点)。然后将调用地址送入PC,使程序转入子程序的入口地址。(先入栈PC低8位,再入栈PC高8位)子程序的返回是通过返回指令RET实现的。该指令的功能是将堆栈存放的返回地址(即断点)弹出堆栈,并送回到PC中,使程序继续从断点处执行。(先出栈PC高8位,再出栈PC低8位)在子程序嵌套过程中可以看出,堆栈在子程序调用中是必不可少的,因为断点地址均是按照“先进后出”的原则存入堆栈的,从而保证了存入的断点地址能依次正确地返回。,子程序设计,子程序结构是汇编语言中一种重要的程序结构。在一个程序中经常会碰到反复执行某程序段的情况,如果重新书写这个程序段,会使程序变得冗长而杂乱。对此,可以采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用它。这样不但可以提高编制和调试程序的效率,而且可以缩短程序长度,从而节省程序存储空间。编制程序实现c=a2+b2(a,b均为1位十进制数)计算某数的平方可采用查表的方法实现,并编写成子程序。只要两次调用子程序,并求和就可得运算结果。,编制程序实现c=a2+b2(a,b均为1位十进制数),计算某数的平方可采用查表的方法实现,并编写成子程序。只要两次调用子程序,并求和就可得运算结果。设a,b分别存放于片内RAM的30H,31H两个单元中,结果c存放于片内RAM的40H单元。程序流程图如图所示。,ORG0200H0200HSR:MOVSP,#4FH;设堆栈指针0203HMOVA,30H;将30H中的内容a送入A0205HLCALLSQR;转求平方子程序SQR处执行0208HMOVR1,A;将a2结果送R10209HMOVA,31H;将31H中的内容b送入A020BHLCALLSQR;转求平方子程序SQR处执行020EHADDA,R1;a2+b2结果送A020FHMOV40H,A;结果送40H单元中0211HSJMP$;程序执行完,“原地踏步”求平方子程序如下(采用查平方表的方法):ORG0400H0400HSQR:INCA0401HMOVCA,A+PC;单字节指令0402HRET0403HTAB:DB0,1,4,9,16,25,36,49,64,81040CHEND,编制程序实现c=a2+b2,(30H)=a,(31H)=b,(40H)=c,综合程序举例(代码转换类),将R0所指出单元中的ASCII码转换成十六进制数,并把结果仍存于原单元中.解:对于小于、等于9的数,ASCII代码减去30H得一位十六进制数,对于大于9的ASCII代码减去37H,则恰好是“0AH0FH”的结果。HEX:MOVA,R0;取操作数CLRCSUBBA,#30H;09的转换MOVR0,A;暂存结果SUBBA,#0AH;结果是否大于9JCSB2;小于、等于9,则返回XCHA,R0SUBBA,#07H;大于9,则再减07HMOVR0,A;存结果SB2:RET,综合程序举例(运算类程序类),例已知被减数在R2、R3中,减数在R6、R7中,且R2、R6为高字节。要把差放在片外存储器0300H、0301H中,且高位在前。解:把双字节无符号数减法编变成子程序减法时先减低位。,BSUB:LCALLASUBMOVA,R4MOVDPTR,#0300HMOVXDPTR,AMOVA,R5INCDPTRMOVXDPTR,A(入口R2、R3被减数R6、R7减数;出口R4高位R5低位)ASUB:MOVA,R3CLRCSUBBA,R7;低位字节相减MOVR5,A;存低位字节差MOVA,R2SUBBA,R6;高位字节相减MOVR4,A;存高位字节差RET,综合程序举例(常用I/O口程序),例P1.0端口输出1kHZ和2kHZ的变频音调,每隔1S交替变换一次。周期数源程序注释1DLV:MOVR2,08H;1kHZ的持续时间1DLV1:MOVR3,0FAH;(R3)=2501DLV2:CPLP1.0;输出1kHZ方波(P1.0取非)2LCALLD0.5ms;延时0.5ms,省略2DJNZR3,DLV22DJNZR2,DLV1;持续1s1MOVR2,#10H;2kHZ的持续时间1DLV3:MOVR3,#0FAH;(R3)=2501DLV4:CPLP1.0;输出2kHZ方波2LCALLD0.25ms;延时0.25ms,省略2DJNZR3,DLV42DJNZR2,DLV3;持续1s2SJMPDLV;反复循环,END,END,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!