《汇编语言程序设计》PPT课件.ppt

上传人:tia****nde 文档编号:12735023 上传时间:2020-05-20 格式:PPT 页数:54 大小:463KB
返回 下载 相关 举报
《汇编语言程序设计》PPT课件.ppt_第1页
第1页 / 共54页
《汇编语言程序设计》PPT课件.ppt_第2页
第2页 / 共54页
《汇编语言程序设计》PPT课件.ppt_第3页
第3页 / 共54页
点击查看更多>>
资源描述
第4章汇编语言程序设计,4.1汇编语言程序设计方法4.2汇编语言程序的基本结构顺序、循环、分支、子程序4.3常用程序设计举例代码转换、查表、逻辑运算、极值查找等,4.1汇编语言程序设计,程序:计算机的一系列指令的有序集合程序设计:编制程序的过程机器语言程序:目标程序直接由机器语言(指令代码)编写的程序汇编语言程序:用汇编语言编写的程序,4.1汇编语言程序设计方法4.1.1程序的设计步骤与方法汇编语言程序设计的特点在于:(1)用汇编语言进行程序设计时,对数据的存放、寄存器和工作单元的使用等要由设计者安排。而高级语言程序设计时,这些工作都由计算机软件安排,程序设计者不必考虑。(2)汇编语言程序设计要求设计人员必须对所使用的计算机的硬件结构有较为详细的了解。特别是对各类寄存器、端口、定时器/计数器、中断等内容要熟悉,以便在程序设计时能熟练使用。,汇编语言程序的设计步骤:(1)分析问题,抽象出描述问题的数学模型(2)确定解决问题的算法(3)分配存储空间及工作单元(4)根据算法绘制流程图(5)编写源程序(6)汇编和调试程序质量的判断:程序执行时间短;占用的内存单元少;程序的逻辑性,可读性;程序的兼容性,可扩展性;程序的可靠性。,4.1.2汇编语言源程序的编辑和汇编汇编语言源程序的编辑编写完成的源程序应以“.ASM”的扩展名保存,以备汇编程序调用。汇编语言源程序的汇编汇编语言源程序必须转换为机器码表示的目标程序,计算机才能执行,这种转换过程称为汇编。对单片机来说,有手工汇编和机器汇编两种汇编方法。鉴于现在PC机的使用非常普遍,这种交叉汇编通常都是在PC机上进行的。汇编完成后,再由PC机把生成的目标程序加载到用户样机上。由于proteus软件有单片机仿真功能,所以我们完全可以通过软件来进行单片机的仿真。,源程序编辑是在微型计算机上,借助编辑软件,编写汇编语言源程序。可供使用的编辑工具很多。例如,在文本区编写一个源程序如下:ORG0030MOVXDPTR,AMOVA,#41HEND编辑结束后,存盘退出。接下来是使用交叉汇编软件,对编辑完成的源程序进行汇编。汇编完成后,如果没有错误则形成目标码文件,格式为:00300033F07441首地址末地址目标码,4.2汇编语言源程序的基本结构,共有四种基本结构形式:顺序结构循环结构分支结构子程序结构,4.2.1顺序结构程序设计顺序结构的程序是指既无循环又无分支(不产生跳转),按程序中指令书写的顺序执行的程序,又称直线程序。这种结构的程序虽然简单,但它是构成任何结构程序的基础。,例:两个1位十进制数相加,结果存于工作寄存器R6、R4中。设两个加数分别在工作寄存器R0和R2中。源程序清单:ORG1000HMAIN:CLRPSW.4;选定工作寄存器区CLRPSW.3MOVA,R0;取第一个数ADDA,R2DAA;十进制调整MOVR4,A;低位保存MOVA,#0ADDCA,#0MOVR6,A;高位保存END,例:已知X、Y、Z分别为片内RAM30H、31H、32H单元的内容,设XY,试编程完成下式的算术运算:S=(X-Y)*Z,并将计算结果S存入片内RAM34H(高字节)、35H(低字节)单元中。由于XY,所以X-Y0,不需要借位;(X-Y)*Z的结果最多占用两个字节。实现该要求的程序流程图如图所示。,程序清单如下:ORG0030HSTART:MOVA,30H;(A)XSUBBA,31H;(A)(A)-YMOVB,32H;(B)ZMULABMOV34H,B;(34H)A*B的高字节MOV35H,A;(35H)A*B的低字节SJMP$END,4.2.2循环程序循环程序一般由四个主要部分组成:(1)初始化部分:设置循环过程工作单元的初始值,例如循环次数、各变量初值、和地址指针初值等。(2)处理部分:为反复执行的程序段,是循环程序的主体部分(简称循环体),一般用于完成主要的计算与操作、地址指针修改等。(3)循环控制部分:用于控制循环的执行和结束。当循环结束条件不满足时,修改控制变量,继续循环;当条件满足时停止循环。(4)结束部分:对循环程序的结果进行分析、处理和存放。,有先执行后判断和先判断后执行两种结构:,循环程序分为单重循环和多重循环。若循环程序的循环体中不再包含循环程序,则称之为单重循环;如果在循环体中还有其他循环程序,即循环嵌套,这样的程序则称为多重循环(二重以上)。在多重循环程序中,只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉,另外,也不允许从循环程序的外部跳入循环程序的内部。,例:把外部RAM5000H50FFH单元的内容清零。ORG2000HSTART1:MOVDPTR,#5000H;循环初始化MOVR0,#00HMOVA,#00HLOOP1:MOVXDPTR,A;循环体INCDPTRINCR0CJNZR0,#00H,LOOP1;循环控制END,INCR0-DECR0?,如果改为先判断后执行?,例:将内部RAM从40H开始连续单元的数据传送到外部RAM从2000H开始的连续单元中,当所传送的数据为0FFH时,传送停止。ORG2000HMAIN:MOVR0,#40H;循环初始化MOVDPTR,#2000HLOOP:MOVA,R0CJNEA,#0FFH,LOOP1;循环控制SJMPNEXTLOOP1:MOVXDPTR,A;循环体INCR0INCDPTRSJMPLOOPNEXT:SJMP$END,例:设MCS-51单片机的时钟频率为fosc=12MHz,试设计延时50ms的延时程序。延时程序所花费的时间是该程序指令的总机器周期数与机器周期的乘积。通常,延时程序采用MOV和DJNZ指令来实现。单循环延时程序,最大的循环次数位256,则程序段为:MOVR0,#00H;机器周期数为1DJNZR0,$;机器周期数为2若单片机晶振为12MHz,则一个机器周期为1us。延时时间:(1+2562)1s513s。需采用多重循环。,多重循环:在一个循环体中又包含了其它的循环程序。这种方式是实现延时程序的常用方法。使用多重循环时,必须注意:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环可以直接转入外循环,实现一个循环由多个条件控制的循环结构方式。,MOVR1,#M;1ToscLOOP:MOVR2,#N;1ToscNOP;1ToscDJNZR2,$;2ToscDJNZR1,LOOP;2Tosc内层循环的机器周期数为Tn=1+1+2*N,总机器周期数为Tm(Tn+2)*M+1.设N=123,M=200,则延时时间为50.001ms。,程序清单:ORG2000HMEQU200NEQU123MOVR1,#M;#200LOOP:MOVR2,#N;#123NOPDJNZR2,$DJNZR1,LOOPSJMP$END,4.2.3分支结构程序设计在实际应用中,不可能所有程序都是直线运行的,相反,多数情况都需要根据不同的条件进行不同的处理,这就会使程序跳转到不同位置去执行,这种结构的程序称为分支结构程序。MCS-51单片机中条件转移指令、比较转移指令、位转移指令等都可实现程序分支。,分支程序基本结构分为单分支和多分支两种。多分支结构特点是:各处理模块是相互排斥的。,条件转移指令,分别为:JZ,JNZ:累加器判零转移指令;CJNE:比较条件转移指令;DJNZ:减1条件转移指令;JC,JNC,JB,JNB,JBC:位控制条件转移指令等。散转指令:JMPA+DPTR(双字节字节),例:片外RAM2000H、2001H单元分别存放两个数,判断这两个数是否相等,如果相等,则位地址7FH置1,否则清零。若判断两个数相等使用比较转移指令很容易实现该题中的要求,程序流程如图所示。,程序流程图,程序如下:ORG0100HMOVDPTR,#2000H;地址指针指向片外2000H单元MOVXA,DPTR;(2000H)AMOVR0,A;AR0MOVDPTR,#2001H;地址指针指向2001H单元MOVXA,DPTR;(2001H)AMOV30H,R0CJNEA,30H,NE;若两个数不相等,则转NESETB7FH;若两个数相等,则7FH单元置1AJMPOVER;转OVERNE:CLR7FH;7FH单元清零OVER:RET,散转结构例:在内部RAM20H和21H单元中有两个无符号的数,由22H中的值决定对该数完成加、减、乘或除运算(20H单元的数为被减数或被除数),运算规则及结果保存处见下表。,ORG1000HMOVA,22HMOVB,21HRLA;AJMP为双字节指令,乘2改变偏移量MOVDPTR,#TABJMPA+DPTRNOPTAB:AJMPADDM;散转表AJMPSUBMAJMPMULMAJMPDIVMADDM:MOVA,20H;加法运算ADDA,BMOV30H,AMOVA,#0ADDCA,#0MOV31H,ASJMPFINISH,SUBM:MOVA,20H;减法运算SUBBA,BMOV40H,ASJMPFINISHMULM:MOVA,20H;乘法运算MULABMOV51H,BMOV50H,ASJMPFINISHDIVM:MOVA,20H;除法运算DIVABMOV61H,AMOV60H,BFINISH:END,例:假定R0中存放的是采集到的被按键键值,共有128个键值(0127),根据该键值转向不同键的处理程序中去。跳转方法:逐个比较,类似CASE。使用散转指令JMPA+DPTR。设(R0)=0n,对应的处理程序入口地址分别为PROG0PROGn,且按照一定的规律排列。,ORG2000HMOVDPTR,#TAB;设置处理程序入口首地址MOVA,R0;R0=0127RLA;?NEXT:JMPA+DPTR;转向形成的散转地址入口TAB:AJMPPROG0;直接转移地址表AJMPPROG1AJMPPROGn,4.2.4子程序设计子程序的概念通常把一些基本操作功能编制为程序段作为独立的子程序,以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。,子程序的调用调用子程序的指令有“ACALL”和“LCALL”,执行调用指令时,先将程序地址指针PC改变(“ACALL”加2,“LCALL”加3),然后PC值压入堆栈,用新的地址值代替。执行返回指令(RET或RETI)时,再将PC值弹出。子程序调用中,主程序应先把有关的参数存入约定的位置,子程序在执行时,可以从约定的位置取得参数,当子程序执行完,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取得需要的结果,这就是参数的传递。,在编写子程序时应注意以下几点:(1)要给每个子程序赋一个名字。子程序的第一条指令的地址被称为子程序的地址或入口地址,该指令前的标号就是该子程序的名称,也是子程序入口地址的代号。(2)在子程序的末尾必须有子程序返回指令RET/RETI。(3)要能正确地传递参数。首先要有入口条件,说明进入子程序时它所要处理的数据如何得到,另外,要有出口条件,即处理的结果是如何存放的。,(4)注意保护现场和恢复现场。注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和单元的内容。保护现场:PUSH,恢复现场:POP(5)注意子程序的通用性。子程序中操作对象尽量采用地址或寄存器形式,而不用立即数。主程序调用子程序的指令:“LCALL”,“ACALL”。子程序返回指令:RET/RETI。子程序可以嵌套,嵌套次数从理论上说是无限的,但实际上由于受堆栈深度的影响,嵌套次数是有限的。,子程序调用与返回过程示意图,例:设有a,b,c三个数(09),存于内部RAM的DataA、DataB和DataC三个单元。编程实现:c=a2+b2。设DataA、DataB、DataC分别对应内部RAM的40H、41H和42H单元。,ORG5000HDataAEQU40HDataBEQU41HDataCEQU42HSTART:MOVA,DataA;取第一操作数ACALLSQR;调用查表子程序MOVR1,A;a2暂存R1MOVA,DataB;取第二操作数ACALLSQR;调用查表子程序ADDA,R1;Aa2b2MOVDataC,A;保存结果,子程序:SQR:INCA;偏移量调整MOVCA,A+PC;查平方表RETTAB:DB0,1,4,9,16,25,36,49,64,81END,4.3常用程序设计举例4.3.1代码转换类程序计算机能识别和处理的仅仅是二进制数,而计算机外设(显示器、LED数码管、打印机等)常使用ASCII码和BCD码,因此,经常需要通过程序完成二进制到BCD码/ASCII码的转换。程序设计中常采用算法处理和查表方式来实现代码转换。,1.十六进制数与ASCII码之间的转换例:将从30H单元开始的连续8个单元中存放的十六进制数转换成其所对应的ASCII码,并分别存放在从40H开始的16个单元中。,;十六进制数(0F)转换成ASCII码子程序HEXAS:CLRCSUBBA,#10JCLOOPADDA,#7LOOP:ADDA,#10;补偿减掉的10ADDA,#30HRET,;完整程序ORG2000HMOVR0,#30H;设定地址指针MOVR1,#40HMOVR7,#8;循环次数NEXT:MOVA,R0;高字节转换SWAPAANLA,#0FHACALLHEXASMOVR1,AINCR1;修改存储地址指针MOVA,R0;低字节转换ANLA,#0FHACALLHEXASMOVR1,A,INCR1INCR0DJNZR7,NEXTNOPSJMP$;$表示当前PC值HEXAS:CLRCSUBBA,#10JCLOOPADDA,#7LOOP:ADDA,#10;补偿减掉的10ADDA,#30HRETEND,2.十六进制数与BCD码的转换例.将累加器A中0FFH范围内的二进制数转换为非压缩的BCD数(0255),并分别保存于40H、41H和42H单元(低位在前)。非压缩的BCD码:一个字节放一位BCD码压缩的BCD码:一个字节放两个BCD码例:(A)0FEH255000000100000010100000101应用:常用于需要数码显示的场合。分离方法:将A中的内容分别除以100和10。,;子程序:HEXBCD:MOVB,#100DIVAB;A中为百位数MOV42H,A;保存百位MOVA,BMOVB,#10DIVAB;A中为十位;B中为个位MOV41H,A;保存十位MOV40H,B;保存个位RET,4.3.2查表程序常用于非线性修正、非线性函数转换以及代码转换等。专用的查表指令(2条):(1)MOVCA,A+DPTR;远程查表,64KB(2)MOVCA,A+PC;近程查表,0+256B1.远程查表通过以下三步操作实现查表。将所查表格的首地址送入DPTR;将要查找的数据序号,即数据在表中的位置送入累加器A中;执行查表指令MOVCA,A+DPTR进行读数并存结果存于累加器A。,(2)MOVCA,A+PC;近程查表,0+256B2.近程查表也可通过以下三步操作来完成。将要查找的数据序号,即数据在表中的位置送入累加器A中;把从查表指令到表的首地址间的偏移量与A值相加;执行查表指令MOVCA,A+PC进行读数,查表结果送累加器A。,例4.13若累加器A中存放的是一位BCD码。通过查表将其转换成为相应的七段显示码,并存入寄存器B中。七段数码显示管连接方式:共阳极和共阴极两种。共阳极是低电平为有效输入,共阴极为高电平为有效输入。,3FH,09的七段码:3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。,假设数码显示管为共阴极。,由于代码没有规律,一般采用查表完成。,若以DPTR为基址(远程查表),程序段如下:MOVA,#05HMOVDPTR,#TABMOVCA,A+DPTRTAB:DB3FH,06H,5BH,4FH,66H,DB6DH,7DH,07H,7FH,6FH,若以PC为基地址(近程查表),则程序段如下:MOVA,#05HADDA,?MOVCA,A+PCNOP;单字节指令RET;单字节指令TAB:DB3FH,06H,5BH,4FH,66H,DB6DH,7DH,07H,7FH,6FH,4.3.3逻辑操作程序逻辑电路中各变量的取值只能是0或1,因此可用MCS-51单片机中的位代替逻辑电路中的各个变量。例:写出图所示电路的逻辑表达式,并编程实现其功能。解:该电路图的最简逻辑表达式为,,ORG1000HXBITP1.0;输入逻辑变量YBITP1.1ZBITP1.2FBITP1.3;输出逻辑变量EXOR:MOVC,XANLC,/YMOVF,C;保存结果于F位MOVC,YANLC,/XORLC,F;XYANLC,ZMOVF,C;F=(XY)ZMOVC,XANLC,Y;C=XYORLC,FMOVF,C;F=(XY)Z+CEND,改进:(1)程序:增加中间位变量(去除冒险竞争)(2)简化罗辑表达式再编程F=XY+XZ+YZ,编程(P120,例4-18),4.3.4数据极值查找程序极值查找:挑出最大值和最小值。例:从内部RAM20H单元开始存放8个数,找出其中的最大数,并放在28H单元中。极值查找的主要内容:进行数值大小的比较。假定:A存放大数,与之比较数始终放在30H单元中。比较结束后,把最大数送28H单元中。,ORG4200HMOVR0,#20H;数据区首地址MOVR7,#08H;数据区长度MOVA,R0;读第一个数DECR7LOOP:INCR0MOV30H,R0;读下一个数CJNEA,30H,CHECK;数值比较CHECK:JNCLOOP1;A值大转MOVA,R0;大数送ALOOP1:DJNZR7,LOOP;未完,继续MOV28H,A;极值送28H单元END,
展开阅读全文
相关资源
相关搜索

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


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

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


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