您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 第4章 80C51单片机汇编语言程序设计 备份
单片机原理与应用Principle&ApplicationofMCU南方医科大学生物医学工程学院2013.9郭淑艳15112138325QQ18036174生命科学大楼6-3-17第4章80C51单片机汇编语言程序设计1教学内容及要求教学内容汇编语言程序的基本结构形式、子程序结构形式80C51单片机汇编语言伪指令80C51单片机汇编语言程序设计举例教学要求掌握顺序结构程序、分支程序、循环程序、和子程序等结构程序的设计等熟悉单片机汇编程序常用的伪指令了解汇编语言程序的格式2汇编语言程序的基本结构形式3分支结构使用条件转移指令对程序的执行结果进行判断JZ、JNZ、CJNE、DJNZJC、JNC、JB、JNB、JBC4【例】二分支。在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中存放着两个无符号二进制数,要求找出其中的大数并存入ST3单元中。5【例】三分支-多次二选一。设变量x存入30H单元,求得函数y存入31H单元。按下式要求给y赋值:x-1(x<5)0(5≤x≤10)x+1(x10)Y=要根据x的大小来决定y值,在判断x<5和y>10时,采用CJNE和JC以及CJNE和JNC指令进行判断。6ORG1000HMOVA,30H;取xCJNEA,#5,NEXT1;与5比较NEXT1:JCNEXT3;x<5,则转NEXT3CJNEA,#10,NEXT2;与10比较NEXT2:JNCNEXT4;x>10,则转NEXT4MOVR0,#0;5≤x≤10,y=0SJMPNEXT5NEXT3:MOVR0,ADECR0;x<5,y=x-1SJMPNEXT5NEXT4:MOVR0,AINCR0;x10,y=x+1NEXT5:MOV31H,R0;存结果SJMP$END7多分支转移使用变址寻址转移指令(散转指令)JMP@A+DPTR;PC←(A)+(DPTR)数据表、转移指令表、堆栈操作8通过数据表实现程序多分支9MOVA,#k;分支序号k送AMOVDPTR,#BRTAB;表首址MOVCA,@A+DPTR;查表后,(A)=BRk-BRTABJMP@A+DPTR;散转指令,(PC)=BRkBRTAB:DBBR0-BRTAB;数据表,BRTAB+0DBBR1-BRTAB;分支入口地址与表首址之差,BRTAB+1…DBBRn-BRTAB;BRTAB+nBR0:…;各个分支程序BR1:……BRn:…通过转移指令表实现程序多分支10MOVA,#k;分支序号k送ARLA;分支序号乘以2MOVDPTR,#BRTAB;表首址JMP@A+DPTR;(PC)=BATAB+2kBRTAB:AJMPBR0;转分支程序0,BRTABAJMPBR1;转分支程序1,BRTAB+2…AJMPBRn;转分支程序n,BRTAB+2nBR0:…;各个分支程序BR1:……BRn:…使用长转移指令LJMP时,MOVA,#kRLAADDA,R3MOVDPTR,#BRTABJMP@A+DPTRBRTAB:LJMPBR0;BRTABLJMPBR1;BRTA+3…LJMPBRn;BRTAB+3n11通过堆栈操作实现程序多分支12MOVDPTR,#BRTAB;分支程序入口地址表首址MOVA,#k;分支序号放入A中RLA;分支序号值乘以2MOVR1,A;暂存A值入R1INCA;A指向低位地址MOVCA,@A+DPTR;取低位地址BRn7-0PUSHACC;低位地址入栈MOVA,R1;恢复A值MOVCA,@A+DPTR;取高位地址BRn15-8PUSHACC;高位地址入栈RET;分支入口地址装入PCBRTAB:DWBR0;分支程序入口地址表,BRTAB、BRTAB+1DWBR1;BRTAB+2、BRTA+3…DWBRn;BRTAB+2n、BRTAB+2n+1RETPC15~8←((SP)),SP←(SP)-1PC7~0←((SP)),SP←(SP)-1循环结构初始化部分对于循环次数计数器、地址指针赋初值,对于使用到的寄存器或者存储单元赋初值,为循环作准备。循环体部分为下一次循环创造条件:修改循环次数计数器、地址指针,避免死循环。循环的判断与控制:判断循环次数计数器,或者检查判断循环条件。可以直接由循环体内转到循环体外或外层循环;不能从循环体外直接跳转到循环体内,只能从外层向内层一层层进入。循环结束处理:结果保存等。13【例】单循环。编程实现把外部RAM中从8000H开始的100个字节数据传送到8100H开始的单元中。MOVR7,#100MOVDPL,#00HLOOP:MOVDPH,#80HMOVXA,@DPTRMOVDPH,#81HMOVX@DPTR,AINCDPLDJNZR7,LOOPMOVR0,#00LOOP:MOVP2,#80HMOVXA,@R0MOVP2,#81HMOVX@R0,AINCR0CJNER0,#100,LOOP或14【例】由循环内部跳出循环。把长度为10H的字符串从内部RAM缓冲区inbuf向位于外部RAM的输出缓冲区outbuf传送,一直进行遇到回车符CR或整个字符串传送完毕。START:MOVR7,#10HMOVR0,#inbufMOVDPTR,#outbufLOOP:MOVA,@R0CJNEA,#0D0H,CONTINUESJMPFINISHCONTINUE:MOVX@DPTR,AINCR0INCDPTRDJNZR7,LOOPFINISH:SJMP$END15子程序在主程序中调用子程序LCALL/ACALL标号;调用子程序时,断点入栈保存由子程序返回主程序RET;子程序返回时,断点出栈从而回到主程序。子程序中,视情况进行现场保护和现场恢复1、使用堆栈:PUSH/POP2、暂存到其它存储单元中,最终恢复即可16调用延时子程序DELAY。主程序:子程序:该子程序根本不需要主程序提供入口参数,从进入子程序开始,到子程序返回,这个过程花费CPU一定的时长。循环体只能执行有限次,避免“死循环”。DELAY:PUSH06HPUSH07HMOVR7,#100DLY0:MOVR6,#98NOPDLY1:DJNZR6,DLY1DJNZR7,DLY0POP07HPOP06HRETLCALLDELAY17子程序的参数传递用累加器和工作寄存器传递参数通过操作数地址传递参数通过堆栈传递参数18用累加器和工作寄存器传递参数这种方法要求所需的入口参数在转入子程序之前将它们存入累加器A和工作寄存器R0~R7中。在子程序中就用累加器A和工作寄存器中的数据进行操作,返回时,查看参数即操作结果就在累加器和工作寄存器中。采用这种方法,参数传递最简单,运算速度最高。但是工作寄存器数量有限,不能传递更多的数据。19【例】利用工作寄存器传递参数。双字节求补子程序。入口参数(R7R6)=16位数;出口参数(R7R6)=求补后的16位数。CPLD:PUSHACCMOVA,R6CPLAADDA,#1MOVR6,AMOVA,R7CPLAADDCA,#0MOVR7,APOPACCRET20通过操作数地址传递参数子程序中所需要操作数存放在数据存储器RAM中。调用子程序之前的入口参数为R0、R1或DPTR间接指出的地址;出口参数(即操作结果)仍是由R0、R1或DPTR间接指出的地址。一般内部RAM由R0、R1作地址指针,外部RAM由DPTR作地址指针。这种方法可以节省传递数据的工作量,可实现变字长运算。21【例】通过操作数地址传递参数。N字节求补子程序。入口参数:(R0)=求补数低字节指针,(R7)=N-1出口参数:(R0)=求补后的高字节指针。CPLN:PUSHACCMOVA,@R0CPLA;取反ADDA,#1;加1MOV@R0,A;求补后送回R0间接寻址的地址中MOVA,R7;判断N=1?JNZNEXT;N≠1,则继续求补SJMPFINISH;N=1,则返回NEXT:INCR0MOVA,@R0CPLAADDCA,#0MOV@R0,ADJNZR7,NEXTFINISH:POPACCRET22通过堆栈传递参数在调用子程序前,先把参与运算的操作数压入堆栈。转入子程序之后,可用堆栈指针SP间接访问堆栈中的操作数,同时又可以把运算结果压入堆栈中。返回主程序后,可用POP指令获得运算结果。注意:转入子程序时,主程序的断点地址也要压入堆栈,占用堆栈两个字节,所以弹出参数前要用两条DECSP指令修改SP指针,以便使SP指向操作数。另外在子程序返回指令RET之前要加两条INCSP指令,以便使SP指向断点地址,保证能正确返回主程序。使用堆栈来传递参数,方法简单,能传递大量参数,不必为特定参数分配存储单元。23【例】将HEX单元的高低半字节分别转换成ASCII码并存入ASC和ASC+1单元。需要进行两次ASCII码转换,故设置子程序来完成。在主程序中设置了入口参数HEX入栈,即HEX被推入SP+1指向的单元,当执行LCALLHASC指令之后,主程序的断点地址PC也被也被压入堆栈,即PCL被推入SP+2单元、PCH被推入SP+3单元。24MAIN:PUSHHEX;取被转换数入栈LCALLHASC;转入子程序POPASC;ASCLASCMOVA,HEX;再取被转换数SWAPA;处理高4位PUSHACC;入栈LCALLHASC;调用子程序POPASC+1;ASCHASC+1HASC:DECSPDECSPPOPACCANLA,#0FHMOVDPTR,#ASCTABMOVCA,@A+DPTRPUSHACC;INCSP;INCSP;RET;ASCTAB:DB‘01234567’;DB‘89ABCDEF’子程序:主程序:25LCALLPC←(PC)+3,SP←(SP)+1,(SP)←(PC7~0)SP←(SP)+1,(SP)←(PC15~8)RETPC15~8←((SP)),SP←(SP)-1PC7~0←((SP)),SP←(SP)-1机器编辑→交叉汇编→串行传送26地址机器码标号助记符指令80007820SORT:MOVR0,#20H80027F07MOVR7,#07H*.ASM编辑、汇编编辑:编写程序的过程称为编辑。机器编辑指借助于微型机进行单片机的程序设计,通常都是使用编辑软件进行源程序的编辑。编辑完成后,生成一个由汇编指令和伪指令构成的扩展名为”.ASM”的ASCII码文件。汇编:汇编语言源程序不能在单片机中直接执行,必须将其“翻译”为用二进制代码(机器语言)表示的目标程序才能执行。这个“翻译”过程称为汇编。机器汇编指由计算机通过汇编程序完成从汇编语言源程序到机器语言目标程序的“翻译”工作。交叉汇编指使用一种计算机(PC)的汇编程序为另一种计算机(单片机)的源程序进行汇编即运行汇编程序进行汇编的是一种计算机,而汇编得到的目标程序是另一种计算机用的。2780C51单片机汇编语言伪指令汇编时,源程序须向汇编程序发出一些指示信息,协助完成汇编工作,这一工作是由伪指令来完成的。汇编起始地址命令ORG(Origin)定义字节命令DB(DefineByte)定义数据字命令DW(DefineWord)预留存储区命令DS(DefineStorage)位定义命令BIT赋值命令EQU(Equate)数据地址赋值伪指令DATA汇编终止命令END(Endofassembly)注意!伪指令仅供汇编程序将源程序翻译成目标程序,本身并不形成机器码。28汇编起始地址命令ORG(Origin)规定程序或数据的起始存放地址。出现在每段源程序或数据块的开始地址项是16位绝对地址,或者标号,或者表达式。在一个汇编语言源程序中允许使用多条定位伪指令,但其值应从小到大,并与前面的存放地址不重叠。如果程序的开始不放ORG,则汇编程序将从0000H单元开始放目标程序代码。ORG地址29ORG0000H;从0000H单元开始存放下面的指令LJMP0030HORG0030H;从0030H单元开始存放下面的指令MA
本文标题:第4章 80C51单片机汇编语言程序设计 备份
链接地址:https://www.777doc.com/doc-3955584 .html