




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/11/23,第9章子程序的设计,1,8086/8088和ARM核汇编语言程序设计,第9章子程序设计,教学重点:子程序设计方法,2019/11/23,第9章子程序的设计,2,9.2子程序的参数传递,9.3子程序嵌套与递归,第9章子程序设计,9.1子程序设计方法,9.4子程序库,2019/11/23,第9章子程序的设计,3,子程序又称为过程,是能完成特定功能有一定通用性的程序段,在需要时能被其它程序调用。调用子程序的程序常称为主程序。一般把源程序中反复出现的程序段或常用的功能独立的程序段设计成子程序供用户使用。这样可以简化源程序结构、节省目标程序的存储空间,提高程序设计的效率。子程序结构也是模块化程序设计的基础。本章主要介绍子程序的定义、子程序调用和返回、子程序的参数传递以及子程序库等知识。,9.1子程序设计方法,2019/11/23,第9章子程序的设计,4,9.1子程序设计方法,9.1.1子程序的定义,子程序的定义是由过程定义伪指令PROC和ENDP实现,格式如下:过程名PROCNEAR|FAR;过程体过程名ENDP,NEAR属性的过程只能被相同代码段的其他程序调用,FAR属性的过程可以被不同代码段的程序调用。,(1)子程序和主程序在同一个代码段中,则子程序定义为NEAR属性。(2)子程序和主程序不在同一个代码段中,则子程序定义为FAR属性。(3)主程序通常定义为FAR属性,这是因为主程序被看作DOS调用的一个子程序,以便执行完返回DOS。,2019/11/23,第9章子程序的设计,5,9.1子程序设计方法,9.1.1子程序的定义,子程序可以放在代码段主程序开始执行之前的位置,也可放在代码段的末尾主程序执行终止后的位置。,为了便于其他程序员能正确使用子程序,在编写子程序时,还要养成书写子程序说明信息的良好习惯。子程序说明信息一般包括以下内容:(1)子程序名(2)功能描述(3)入口和出口参数(4)调用注意事项和说明等,2019/11/23,第9章子程序的设计,6,9.1子程序设计方法,9.1.1子程序的定义,例9.1编写一个子程序,从键盘输入一位十进制数。;子程序名:stdin;功能:完成从键盘输入一位十进制数;入口参数:等待键盘输入;出口参数:al中存放输入的数值stdinprocmovah,1int21hcmpal,30hjlnextcmpal,39hjgnextandal,0fhnext:retstdinendp,2019/11/23,第9章子程序的设计,7,9.1子程序设计方法,9.1.2子程序调用与返回,子程序调用与返回由CALL和RET指令实现。,子程序调用指令首先把子程序的返回地址(即CALL指令的下一条指令的地址)压入堆栈,然后转移到子程序的入口地址执行子程序。根据子程序和主程序是否在同一代码段,分为段内调用和段间调用。子程序和主程序在同一个代码段中称为段内调用;子程序和主程序不在同一个代码段中,称为段间调用。子程序返回指令负责把压入栈区的返回地址弹出送IP或CSIP,实现返回主程序继续往下执行。与子程序的段内调用和段间调用相对应,子程序的返回也分为段内返回和段间返回。,2019/11/23,第9章子程序的设计,8,9.1子程序设计方法,9.1.2子程序调用与返回,当子程序和主程序在同一个代码段中,子程序的定义和调用如下图:,codesegmentmainprocfarcallsubaretmainendpsubaprocnearretsubaendpcodeends,2019/11/23,第9章子程序的设计,9,9.1子程序设计方法,9.1.2子程序调用与返回,当子程序和主程序不在同一个代码段中,子程序的定义和调用如下图:,code1segmentmainprocfarcallfarptrsubaretmainendpcode1endscode2segmentsubaprocfarretsubaendpcode2ends,2019/11/23,第9章子程序的设计,10,9.1子程序设计方法,9.1.3寄存器内容的保护与恢复,通常主程序和子程序是分别编制的,所以它们可能会使用同一个寄存器。如果主程序中某个寄存器的内容在调用子程序后还要用,而子程序又恰好使用了同一个寄存器,当子程序修改了寄存器的内容后,返回到主程序时,该寄存器的内容也就不会是调用子程序前的内容,这样,常常会导致调用程序的出错。为此,编写子程序时,在一进入子程序后,就把它所用到的寄存器内容压进栈,在返回前,再把它们弹出栈。,为什么寄存器的保护与恢复?,2019/11/23,第9章子程序的设计,11,9.1子程序设计方法,9.1.3寄存器内容的保护与恢复,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSHAXPUSHBXPUSHCX;保护现场PUSHDXPOPDXPOPCXPOPBX;恢复现场POPAXRET;返回断点处PROCENDP,注意:堆栈“先进后出”的操作特点,恢复寄存器的顺序不能搞错。,2019/11/23,第9章子程序的设计,12,9.2子程序的参数传递,9.2.1用寄存器传递参数,优点:直接、简便,只要把参数存放在约定的寄存器中就行了。缺点:适用于传递参数较少的情况。,例9.3从键盘输入一组字符,直到“0”为止。编一子程序,完成当输入是小写字母时,则修改为大写字母。输入的字符存放在string为首址的存储单元中。,参数可以增加子程序的灵活性和通用性。调用程序传送给子程序的参数称为入口参数,子程序返回给调用程序的结果称为出口参数。,2019/11/23,第9章子程序的设计,13,9.2子程序的参数传递,9.2.1用寄存器传递参数,;主程序Datasegmentstringdb100dup(?)dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovdi,offsetstringagain:movah,1int21hcmpal,,0jeexitcallstobmovdi,alincdijmpagainexit:movah,4chint21h,;子程序名:stob;功能:将小写字母修改为大写字母;入口参数:al存放输入的字符;出口参数:al存放修改后的字符stobprocnearcmpal,61hjbnextcmpal,7ahjanextsubal,20hnext:retstobendpcodeendsendstart,2019/11/23,第9章子程序的设计,14,9.2子程序的参数传递,9.2.2用存储单元传递参数,这种方法是使用存储单元传递参数的,即主程序在存储单元建立一个参数表,存放子程序所要的参数,在主程序中将该参数表首地址传送给子程序,子程序通过参数表取得所需参数,并把结果也存放到指定存储单元中。优点:适合于传递参数较多的情况。,第十六讲,2019/11/23,第9章子程序的设计,15,9.2子程序的参数传递,9.2.2用存储单元传递参数,例9.4使用存储单元传递参数的方法来实现例9.3。,;主程序datasegmentstringdb100dup(?)Lentdw?dataendscodesegmentassumecs:code,ds:datamainprocfarstart::pushdsmovax,,0pushaxmovax,datamovds,axmovcx,0movdi,offsetstringagain:movah,1int21hcmpal,0jenext,movdi,alincdiinccxjmpagainnext:movlent,cxleabx,stringcallstob1ret,2019/11/23,第9章子程序的设计,16,9.2子程序的参数传递,9.2.2用存储单元传递参数,;子程序名:stob1;功能:将小写字母修改为大写字母;入口参数:bx存放数据存储单元首址;出口参数:修改后的字符存回原存储单元中stob1procmovcx,lentagain1:moval,bxcmpal,61hjbnext1cmpal,7ahjanext1subal,20hmovbx,alnext1:incbxdeccxjnzagain1retstob1endpmainendpcodeendsendstart,2019/11/23,第9章子程序的设计,17,9.2子程序的参数传递,9.2.3用堆栈传递参数,用堆栈传递入口参数时,要在调用子程序前把有关参数依次压栈,子程序从堆栈中取得入口参数;用堆栈传递出口参数时,要在子程序返回前,把有关参数依次压栈,主程序就可以从堆栈中取到出口参数。优点:适合于传递参数较多的情况。注意:避免因堆栈操作而造成子程序不能正确返回的错误。,2019/11/23,第9章子程序的设计,18,9.2子程序的参数传递,9.2.3用堆栈传递参数,例9.5编一子程序:求有符号字数组array中元素的最小值。数组元素的个数存放在cont字单元中。Datasegmentarraydw100,66,-1,88,20contdw5mindw?dataendsstacksegmentdw128dup(?)stackendscodesegmentassumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovax,offsetarraypushax;数组偏移地址进栈movax,contpushax;元素个数进栈callfindminmovmin,ax;保存出口参数movah,4chint21h,2019/11/23,第9章子程序的设计,19,9.2子程序的参数传递,9.2.3用堆栈传递参数,;子程序名:findmin;功能:求有符号字数组中元素的最小值;入口参数:数组首地址和元素个数在堆栈中;出口参数:ax中存放最小值findminprocpushbpmovbp,sp;为取参数作准备pushbxpushcxmovbx,bp+6;从堆栈中取数组首地址送bxmovcx,bp+4;从堆栈中取元素个数送cxdeccxmovax,bx;取出第一个元素给AXagain:addbx,2cmpbx,ax;与下一个数据比较jgnextmovax,bxnext:loopagainpopcxpopbxpopbpret,fminendpcodeendsendstart,2019/11/23,第9章子程序的设计,20,9.3子程序嵌套与递归,一个子程序也可以作为调用程序去调用另一个子程序,称为子程序嵌套。,递归子程序:如果一个子程序调用的是子程序的本身,就是递归子程序。,例9.6编程计算n!(设0n6)分析:求n!的递归定义为:,2019/11/23,第9章子程序的设计,21,9.3子程序嵌套与递归,DatasegmentNumdb3Resultdw?DataendsStacksegmentparastackstackdb100dup(?)StackendsCodesegmentassumecs:code,ds:data,ss:stackMainprocfarBegin:pushdsxorax,axpushaxmovax,datamovds,ax,2019/11/23,第9章子程序的设计,22,9.3子程序嵌套与递归,movah,0moval,numcallfactormovresult,axretMainendp,Factorprocpushaxsubax,1jnef_contpopaxjmpreturnf_cont:callfactorpopcxmulclreturn:retfactorendpCodeendsendbegin,IP1,Movresult,ax地址,3,IP2,Popcx地址,2,IP3,Popcx地址,1,ax=1,IPPOPCX地址,cx=2,ax*cx=1*2,IPPOPCX地址,cx=3,ax*cx=1*2*3,IPMovresult,ax地址,2019/11/23,第9章子程序的设计,23,9.4子程序库,开发大型应用程序时,通常把复杂的程序分成很多功能独立的模块,分别编写成子程序,对各个子程序模块单独进行汇编产生相应的目标模块(OBJ文件),最后再用连接程序把它们连接起来,形成一个完整的可执行程序。采用这种模块化程序设计方法,程序不但结构清晰,也便于调试。采用模块化程序设计,各模块之间会存在着相互调用,即一个模块会引用在另一个模块中定义的标识符(包括变量、标号、过程名等)。标识符有两种:1)在本模块中定义,供本模块使用的标识符称为局部标识符;2)在一个模块中定义,而又在另一个模块中引用的标识符称为外部标识符。,2019/11/23,第9章子程序的设计,24,9.4子程序库,为了解决各模块间标识符的交叉访问,汇编语言提供了二条伪指令PUBLIC和EXTRN。,(1)伪指令PUBLIC说明:当前模块中哪些标识符是能被其它模块引用的外部标识符。其格式如下:PUBLIC标识符,标识符,;定义标识符的模块使用,(2)伪指令EXTRN说明:在当前模块所使用的标识符中,哪些标识符是已在其它模块中被定义为指定类型的标识符。格式如下:EXTRN标识符:类型,标识符:类型,;调用标识符的模块使用,2019/11/23,第9章子程序的设计,25,9.4子程序库,例9.7从键盘输入一个数n((0n6),求n!,并输出结果。把例9.1、例9.2例和9.6的子程序编写成子程序模块,供主程序调用。,;子程序stdin.asmpublicstdincodesegmentstdinprocfar;例9.1中的输入子程序stdinstdinendpcodeendsend;子程序dispax.asmpublicdispaxdatasegmentdb4dup(?),0ah,0dh,$dataendscodesegmentdispaxprocfar;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年食品与饮料行业休闲食品市场细分领域研究报告
- 智慧港口自动化装卸设备在港口智能化改造中的应用报告
- 2025年元宇宙社交平台社交内容质量评估与用户体验研究
- 2025年医院信息化建设:电子病历系统智能药物市场趋势优化报告
- 2025年医药行业研发投入与成果转化研究报告
- 江苏省扬州市邗江区2025届英语八年级第二学期期末调研试题含答案
- 咨询工程师2025教材课件
- 2025年医药企业CRO模式下的临床试验监测与数据质量控制报告
- 周末假期安全课件
- 汕头市重点中学2025届英语七下期中学业水平测试模拟试题含答案
- 餐饮行业智慧餐厅建设方案
- 与幂有关的运算解答题(5大题型提分练)七年级数学下册同步课堂(北师大版2024)
- 燃气管道安全事故应急预案
- 2025年餐饮业合伙协议模板:农家乐合作经营框架协议3篇
- 2025年安徽新华传媒股份有限公司招聘笔试参考题库含答案解析
- 《国防动员实施》课件
- 高处坠落安全课件
- H3CNE认证考试题库及答案详解
- 景观绿化工程监理规划范文
- 公路工程施工质量控制培训
- 中国高血压防治指南(2024年修订版)
评论
0/150
提交评论