第4章--汇编语言程序设计ppt课件_第1页
第4章--汇编语言程序设计ppt课件_第2页
第4章--汇编语言程序设计ppt课件_第3页
第4章--汇编语言程序设计ppt课件_第4页
第4章--汇编语言程序设计ppt课件_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,1,第4章汇编语言程序设计,4.1概述,4.2简单程序,4.3分支程序,4.4循环程序,4.6子程序的设计及调用,4.7程序设计举例,4.5查表程序,下页,.,2,4.1概述,一、汇编语言和高级语言相比具有下列优点:,上页,下页,回目录,专有特性,MOVP1,A,如:输出操作,.,3,二、汇编语言程序设计的步骤:,三、汇编语言程序的结构,上页,下页,回目录,.,4,例1:内部RAM从DATA1单元有一数据块,存放若干无符号数,第一单元为数据块长度,求这些无符号数之和。,起始地址,程序主体,汇编结束标志,标号,注释,上页,下页,回目录,.,5,上页,下页,回目录,四、评价程序质量的标准:,程序的执行时间,程序所占用的内存字节数目,程序的逻辑性、可读性,程序的兼容性、可扩展性,程序的可靠性,时间空间,.,6,4.2.1顺序程序例4.1设三字节无符号数相加,被加数:在内部RAM20H22H单元(低位在前),加数:在内部RAM30H32H单元(低位在前),结果:存于内部RAM2022H单元,进位位存于23H单元。利用ADDC指令进行多字节加法运算。,.,7,ORG5000HMOVR0,#20H;被加数的低字节地址MOVR1,#30H;加数的低字节地址MOVA,R0ADDA,R1;低字节相加MOVR0,A;存放字节相加结果INCR0INCR1MOVA,R0ADDCA,R1;中间字节带进位相加MOVR0,A;存中间字节相加结果,.,8,INCR0INCR1MOVA,R0ADDCA,R1;高字节带进位相加MOVR0,A;存高字节相加结果INCR0MOVA,#00HADDCA,#00HMOVR0,A;进位位送23HEND,.,9,例4.2将片内RAM20H单元的内容拆成两段,每段4位。并将它们分别存入21H与22H单元中。(20H)=0101,1010=5AH(21H)=0AH(22H)=05H,.,10,ORG5000HSTART:MOVR0,#21H;R021HMOVA,20H;A(20H)ANLA,#0FH;A#0FH(A)MOVR0,A;(R0)(A),保存低4位INCR0;R0(R0)1MOVA,20H;A(20H)SWAPA;高低半字节交换ANLA,0FH;A0FHMOVR0,A;(R0)(A)END,.,11,4.2简单程序,简单程序的特点:,既无分支,又无循环,按照顺序执行,例4-2:将一个字节内的两个BCD码拆开并变成ASCII码,存入两个RAM单元。BCD码放在内RAM的20H,转换后高半字节放到21H,低字节放22H。,BCDHBCDL,0011,0011,方法1:,BCD码09对应的ASCII码为30H39H转换时,将20H中的BCD码拆开,高四位置为“0011”即可。,BCDH,BCDL,上页,下页,回目录,可完成一定的基本功能,是编写复杂程序的基础,.,12,程序:,0011BCDH,00000000,;两个BCD数送A,;BCDL数送22H,;完成转换,;BCDH数送A的低4位,;完成转换,;存数,BCDHBCDL,BCDL,0000,0011,0000,BCDH,0011,上页,下页,回目录,;原地踏步,相当与停机,.,13,方法1小结:,以上程序用了8条指令,15个内存字节,执行时间为9个机器周期。,方法2:,采用除10H取余法将两个BCD数拆开,BCDHBCDL,00010000,0000BCDH,0000BCDL,DIVAB,上页,下页,回目录,.,14,0011BCDH,0011BCDL,程序:,;取BCD码至A,;完成转换,;存ASCII码,;完成转换,;存ASCII码,BCDHBCDL,00010000,0000BCDH,0000BCDL,DIVAB,0011,0011,上页,下页,回目录,.,15,方法2小结:,以上程序用了7条指令,16个内存字节,执行时间为13个机器周期。,上页,下页,回目录,.,16,将内部RAM的20H单元中的8位无符号二进制数,转换为3位BCD码,并将结果存放在FIRST(百位)和SECOND(十位、个位)两个单元中。,例4-4:,解:,可将被转换数除以100,得百位数;余数除以10得十位数;最后余数即为个位数。,编程如下:,例如:255(十进制)除以100,得2(百位数)余数除以10,得5(十位数)最后余数5即为个位数,上页,下页,回目录,.,17,55H,程序(设(20H)=0FFH):,;除100,;百位BCD,;除10,;除数10B,;十位数送高位,;A为十位、个位BCD,;存十位、个位数,0FFH,64H,02H,37H,0AH,37H,MOVA,B,05H,05H,50H,55H,02H,上页,下页,回目录,FIRST,SECOND,.,18,4.2.2分支程序分支程序的基本结构:单分支和多分支。其特点是:各处理模块是相互排斥的。,.,19,13条条件转移指令,分别为:JZ,JNZ:累加器判零转移指令;CJNE:比较条件转移指令;DJNZ:减1条件转移指令;JC,JNC,JB,JNB,JBC:位控制条件转移指令等四类。,.,20,4.3分支程序,简单分支:,测试标志位,解:,这是一个简单分支程序,可以使两数相减,若CY=1,则被减数小于减数。用JC指令进行判断。,N路分支:,利用散转指令JMPA+DPTR可转向任一处理程序,例4-5设内RAM30H,31H存放两个无符号数,试比较两数的大小,较小的数存入30H单元,较大的数存入31H单元。,程序的流程图如下:,简单分支程序举例:,上页,下页,回目录,多重分支:,判断程序设置的条件,判断2个以上的条件,被称为复合条件,根据程序运行情况,可以有N种选择,.,21,程序:,;做减法比较两数,;若(30H)小,则转移,;交换两数,流程图:,CY=1则转移,若CY1则顺序执行,上页,下页,回目录,.,22,例4-6:空调机制冷时,若排出的空气温度比吸入的空气温度低8则认为工作正常,否则便认为是故障,并设置故障标志。,解:,为了可靠的监控空调机的工作情况,做两次减法:第一次(40H)-(41H),若CY=1,则肯定有故障;第二次两个温度的差值减去8,若CY=1,则肯定有故障,程序的流程图如下:,上页,下页,回目录,首先定义一些工作单元,低,高,置热?,置冷能力不足?,.,23,流程图:,上页,下页,回目录,故障,正常,入出,故障,.,24,程序:,;A(40H)-(41H),;CY=1,则故障,;是则故障,;温度小于8?,;工作正常标志,;转出口,;设置故障标志,若CY1顺序执行,CY=1转移,CY=1转移,若CY1顺序执行,上页,下页,回目录,;停机,.,25,例4.10假定R0中存放的是采集到的被按键键值,共有128个键值(0127),根据该键值转向不同键的处理程序中去。跳转方法:逐个比较,类似CASE。使用散转指令JMPA+DPTR。设(R0)0n,对应的处理程序入口地址分别为PROG0PROGn,且按照一定的规律排列。,多分支程序结构,.,26,ORG2000HMOVDPTR,#TAB;设置处理程序入口首地址MOVA,R0RLA;NEXT:JMPA+DPTR;转向形成的散转地址入口TAB:AJMPPROG0;直接转移地址表AJMPPROG1AJMPPROGn,.,27,多重分支程序举例,例4-7:设30H单元存放的是一元二次方程ax2+bx+c=0根的判别式=b24ac的值。,试根据30H单元的值,编写程序,判断方程根的三种情况。在31H中存放“0”代表无实根,存放“1”代表有相同的实根,存放“2”代表两个不同的实根。,解:,为有符号数,有三种情况,这是一多重分支程序即小于零,等于零、大于零。可以用两个条件转移指令来判断,首先判断符号位,用指令JNBACC.7,rel判断,若ACC.7=1,则一定为负数;此时0若ACC.7=0,则0。此时再用指令JNZrel判断若0,则0,否则=0,上页,下页,回目录,.,28,流程图:,上页,下页,回目录,0,则无实根,=0,则1个实根,0,则2个实根,P124,.,29,程序:,;0转TOW,;有两个不同实根,上页,下页,回目录,P124,.,30,循环程序设计,.,31,循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。,.,32,循环:单重循环多重循环(二重以上)循环嵌套。在多重循环程序中,只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉,另外,也不允许从循环程序的外部跳入循环程序的内部。,.,33,例4.5把外部RAM500050FFH单元的内容清零。ORG4200HSTART1:MOVR0,#00H;设置循环初始值MOVDPTR,#5000HLOOP1:MOVA,#00HMOVXDPTR,A;外部RAM单元清零INCDPTR;外部RAM单元加1INCR0;循环次数加1CJNER0,#00H,LOOP1;循环控制END,.,34,例4-6设三字节无符号数相加,被加数:内部RAM20H22H单元(低位在前),加数:内部RAM30H32H单元(低位在前),结果:存于内部RAM2022H单元,进位位存于23H单元。利用ADDC指令进行多字节加法运算。,.,35,ORG4200HMOVR0,#20H;被加数的低字节地址MOVR1,#30H;加数的低字节地址MOVR2,#03H;循环次数CLRCLOOP:MOVA,R0ADDCA,R1;低字节相加MOVR0,A;存放字节相加结果INCR0INCR1DJNZR2,LOOP;循环控制MOVA,#00HADDCA,#00HMOVR0,A;进位位送23HEND,.,36,循环程序:一些有规可循而又反复处理的问题,利用比较转移指令CJNE、减1不为“0”转移指令DJNZ等实现,例4-13:在内部RAM30H4FH连续32个单元中存放了单字节无符号数,求32个无符号数之和,并存入内部RAM51H,50H中。,解:,这是重复相加问题,要设置一些工作单元设:R0做加数地址指针,R7做循环次数计数器,R3做和数的高字节寄存器。,程序的流程图如下:,上页,下页,回目录,地址指针,循环次数计数器,.,37,流程图:,上页,下页,回目录,N,Y,N,Y,(A)+(R0)A,(R3)+1R3,P130,.,38,程序:,;取被加数,;R0作加数地址指针,;CY=0,和(B)则恢复A,;未完继续比较,;存最大数,;*若用RET指令结尾则该程序可作子程序调用,;作减法比较,RET,.,42,例4-15:从外部RAMBLOCK单元开始有一数据块,数据块长度存入LEN单元,,试统计其中正数、负数和零的个数,分别存入PCOUNT、MCOUNT、ZCOUNT单元。,解:这是一个多重分支的单循环问题。数据块中是带符号数,先用JBACC.7,rel指令判断符号位。,程序的流程图如下:,若ACC.7=1,则该数一定是负数,MCOUNT单元加1;,若ACC.7=0,则该数可能是正数,也可能是零;,用JNZrel判断A是否为零,若A0,则一定是正数,PCOUNT单元加1;,若既不为正也不为负,则一定是零,ZCOUNT单元加1;,上页,下页,回目录,P132请阅读!,阅读!,.,43,流程图:,上页,下页,回目录,P132,负数,正数,零,.,44,程序:,上页,下页,回目录,.,45,上页,下页,回目录,P132,.,46,作业P156:2、6、13、16,.,47,查表程序,上页,下页,回目录,对于复杂参数的计算如:,非线性参数,对数、指数、三角函数,微分、积分等,用汇编编程十分困难,甚至无法建立数学模型,用查表的方法简单便捷,MCS-51指令系统中有两条指令具有极强的查表功能,(1)MOVCA,A+DPTR,作基址寄存器,作变址寄存器,长查表指令,寻址64KB,(2)MOVCA,A+PC,作基址寄存器,作变址,短查表指令页内查表指令,指向表格首址,指向表格的第i项,第i项加变址调整值,.,48,查表程序常用于非线性修正、非线性函数转换以及代码转换等。专用的查表指令:MOVCA,A+DPTR;远程查表,64KB通过以下三步操作实现查表。将所查表格的首地址送入DPTR;将要查找的数据序号,即数据在表中的位置送入累加器A中;执行查表指令MOVCA,A+DPTR进行读数并存结果存于累加器A。,.,49,例4.13若累加器A中存放的是一位BCD码。通过查表将其转换成为相应的七段显示码,并存入寄存器B中。七段数码显示管连接方式:共阳极和共阴极两种。共阳极是低电平为有效输入,共阴极为高电平为有效输入。假设数码显示管为共阴极。09的七段码为3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。由于代码没有规律,一般采用查表完成。,.,50,3FH,.,51,若以DPTR为基址,程序段如下:MOVA,#05HMOVDPTR,#TABMOVCA,A+DPTRTAB:DB3FH,06H,5BH,4FH,66H,DB6DH,7DH,07H,7FH,6FH,.,52,例:用查表法计算平方(一)ORG0000HMOVDPTR,#TABLE;表首地址送DPTRMOVA,#05;被查数字05AMOVCA,A+DPTR;查表求平方SJMP$TABLE:DB0,1,4,9,16,25,36,49,64,81END,.,53,MOVCA,A+PC;近程查表,-128+127B其实现查表也可通过以下三步操作来完成。将要查找的数据序号,即数据在表中的位置送入累加器A中;把从查表指令到表的首地址间的偏移量与A值相加;执行查表指令MOVCA,A+PC进行读数,查表结果送累加器A。,.,54,若以PC为基地址,则程序段如下:MOVA,#05HADDA,#01HMOVCA,A+PCNOPTAB:DB3FH,06H,5BH,4FH,66H,DB6DH,7DH,07H,7FH,6FH,.,55,例:用查表法计算平方(二)ORG0000H0000HMOVA,#05;05A0002HADDA,#02;修正累加器A0004HMOVCA,A+PC;查表求平方0005HSJMP$0007H:DB0,1,4,9,16,25,36,49,64,81END,.,56,例4-20:一个十六进制数放在HEX单元的低四位,将其转换成ASCII码,解:,十六进制09的ASCII码为30H39H,AF的ASCII码为41H46H,,上页,下页,回目录,ASCII码表格的首址为ASCIITAB,.,57,上页,下页,回目录,编程1:,0123456789,ABCDEF,(A)=3,33H,(A)=15,46H,.,58,编程2:,;2字节,;1字节,#3,上页,下页,回目录,;变址调整,.,59,ALU,(PC)=0207H,01H,04H,31H,查十六进制数“01H”的ASCII码(PC做基址),上页,下页,回目录,.,60,ALU,01H,31H,查十六进制数“01H”的ASCII码(DPTR做基址),020BH,上页,下页,回目录,.,61,4.2.4子程序设计子程序与一般程序的主要区别是在子程序的末尾有一条子程序返回指令(RET),其功能是执行完子程序后通过将堆栈内的断点地址弹出到PC而返回到主程序中。在编写子程序时应注意以下几点:(1)要给每个子程序赋一个名字。实际上是一个入口地址的代号。(2)要能正确地传递参数。首先要有入口条件,说明进入子程序时它所要处理的数据如何得到,另外,要有出口条件,即处理的结果是如何存放的。,.,62,(3)注意保护现场和恢复现场。注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和单元的内容。保护现场:PUSH恢复现场:POP(4)注意子程序的通用性。主程序调用子程序的指令:“LCALL”,“ACALL”。子程序返回指令:RET。子程序可以嵌套,嵌套次数从理论上说是无限的,但实际上由于受堆栈深度的影响,嵌套次数是有限的。,.,63,例4.11设有a,b,c三个数(09),存于内部RAM的DATAA、DATAB、和DATAC三个单元。编程实现:c=a2+b2。设DATAA、DATAB、DATAC分别对应内部RAM的40H、41H和42H单元。,.,64,ORG5000HDATAAEQU40HDATABEQU41HDATACEQU42HSTART:MOVA,DATAA;取第一操作数ACALLSQR;调用查表程序MOVR1,A;a2暂存R1MOVA,DATAB;取第二操作数ACALLSQR;调用查表程序ADDA,R1;Aa2b2MOVDATAC,A,.,65,子程序:SQR:INCA;偏移量调整MOVCA,A+PC;查平方表RETTAB:DB0,1,4,9,16,25,36,49,64,81END,.,66,4.6子程序的设计及调用,一、子程序的概念,把能完成某种基本操作,并具有相同操作的程序段,单独编成子程序。如:函数、运算、代码转换、数据采集、延时等,利用调用子程序指令(ACALL或LCALL)和从子程序返回指令RET,使用子程序的优点,不必重复书写同样的程序,提高编程效率,程序的逻辑结构简单,便于阅读,缩短了源程序和目标程序的长度,节省了存储器空间,使程序模块化、通用化、便于交流共享资源,便于按某种功能调试,上页,下页,回目录,.,67,二、调用子程序的要点,子程序开头的标号段必须有一个标志,该标志既是子程序的名字又是其入口地址,以便主程序调用。,在主程序中利用指令ACALL或LCALL可转入子程序。该指令具有保护断点的功能,例如:调用延时子程序,LCALL(ACALL)DELY,子程序结尾必须使用一条从子程序返回指令RET,它具有恢复断点的功能,主程序,CALL断点,子程序,RET,1、子程序的结构,上页,下页,回目录,.,68,2、参数传递,子程序入口条件:,在调用一个子程序时,主程序应先把有关参数放到某些约定的位置,子程序运行时,可以从约定的位置得到有关参数。,子程序出口条件:,子程序结束前,也应把处理结果送到约定位置,参数传递的方法:,子程序无须传递参数,这类子程序中所需要的参数是子程序赋予,不需要主程序给出,上页,下页,回目录,.,69,主程序:,子程序:,不需主程序提供入口参数,从子程序开始到子程序返回,大约为20ms,例4-23调用延时子程序DELY,子程序开始的标号,子程序返回指令,调用子程序,上页,下页,回目录,982=196s,1s,1s,设:主频为12MHZ,2s,(196+2+2)100,+3,=20003s=20.003ms,2s,1s,+3,意味着每个机器周期为1s,.,70,用累加器和工作寄存器传递参数,入口参数:,放在累加器A和工作寄存器中R0R7中,出口参数:,放在累加器A和工作寄存器中R0R7中,例4-24双字节求补子程序CPLD,解:采用“变反加1”的方法,十六位数变反加1,不仅低字节要加1,高字节要加低字节的进位。故采用ADD指令,不采用INC指令。INC指令不影响CY位,上页,下页,回目录,.,71,入口参数:(R7R6)=16位数,出口参数:(R7R6)=求补后的16位数,上页,下页,回目录,Cy,+Cy,R7R6,R7R6,.,72,通过操作数地址传递参数,入口参数:(R0)=求补数低字节指针,(R7)=n-1,出口参数:(R0)=求补后高字节指针,例4-25n字节求补子程序CPLN,上页,下页,回目录,地址,.,73,通过堆栈传递参数,解:由于要进行两次转换,故可调用查表子程序完成,主程序,*PCH,*PCL,HEX,栈底,断点地址,上页,下页,回目录,.,74,子程序,上页,下页,回目录,HEX,Result,Result,PC,.,75,HEX,HEX,*PCL,*PCH,断点,ASC,主程序,子程序,上页,下页,回目录,.,76,3、现场保护,现场保护:如果子程序使用的寄存器与主程序使用的寄存器有冲突,在转入子程序前,特别是进行中断服务子程序时,要进行现场保护。,保护内容:主程序使用的内部RAM内容,各工作寄存器内容,累加器A和DPTR以及PSW等寄存器内容。,保护方式:将要保护的单元压入堆栈。,上页,下页,回目录,中断保护时:还可以用RS1RS0来选择其他通用寄存器组,以便保护主程序现场。,R0R7,冲突,.,77,例如:十翻二子程序的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论