第六节 子程序设计.pdfVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 子程序设计 在一个程序中的不同地方,常常需要多次非循环的使用完成特定功能的程序段,这些程 序段除了某些变量的赋值不同以外,具有相同的指令序列。这时,为了减少重复编写程序, 缩短目标代码,节省内存空间,把实现这一功能的指令序列组成一个相对独立的程序段。在 程序运行时,如需要完成这个给定的功能,就转移到这个独立的程序段处执行,待这个独立 程序段的指令序列执行完后,又返回到原来断点位置处继续运行程序。这个单独编制的指令 序列,再加上一些必要的语句,就是子程序。从程序的某处转移到子程序处叫调用子程序, 待子程序执行完毕,重新回到原来断点位置处叫子程序返回。调用子程序的程序也称为主程 序。子程序调用和子程序返回是一种程序转移形式,它们用专门的指令(CALL 和RET )来 实现这种特殊的程序转移。实现这种转移,需要堆栈的支持,所以在程序中一定要定义堆栈 段。 子程序相当于高级语言中的过程和函数,在汇编语言中子程序也称为过程。 使用子程序有下述好处: 1.有利于程序模块化、结构化和自顶向下的程序设计方法,简化了程序设计过程。 2 .增加了源程序的可读性,便于调试维护。 3 .减少了目标代码所占用的空间。 4 .子程序一旦编制成功,在开发研制各种软件时都可使用,缩短了软件的开发周期。 本章着重介绍下面的与子程序设计相关的内容: 1.如何定义、调用与返回子程序。 2 .子程序设计的基本要求。 3 .如何在子程序与主程序间传递参数。 4 .子程序的嵌套与递归调用。 6.1 子程序的调用与返回 6.1.1 子程序的定义 子程序必须定义在一个逻辑段内。子程序的定义由过程定义伪指令 PROC/ENDP 来实 现,它们分别用在子程序的前后,使整个子程序形成清晰的、具有特定功能的代码块。使用 这两条过程定义伪指令所定义的子程序的一般格式如下: PROC_NAME PROC [NEAR/FAR] …… ;过程体 PROC_NAME ENDP 其中,PROC_NAME 为子程序名 (过程名),是一个由用户定义的标识符,一般是子程 序入口的标号地址。PROC 表示子程序定义的开始,ENDP 表示子程序定义的结束,这两条 伪指令必须成对出现。中间为过程体,过程体是一段相对独立的程序,是完成子程序功能的 程序主体,并且必须使用返回指令RET 作为逻辑上最后一条指令。在定义子程序的时候, 用户可以选择定义过程的类型属性为NEAR 或FAR ,当缺省时,隐含为NEAR 。 子程序具有三个属性:段属性、偏移量属性和类型属性。段属性表示了该子程序所在段 的段基值。偏移量属性表示了该子程序在段中的偏移量。类型属性也称为距离属性,可以是 NEAR 或FAR 。属性为NEAR 的子程序只能在本段(子程序所在段)内调用,而属性为FAR 的子程序则可以在本段以及其它段中调用。 6.1.2 调用指令 当主程序调用属性是NEAR 的子程序时,CPU 把当前指令指针IP 的内容压入堆栈,作 为返回地址保存起来,然后将子程序的偏移量送入IP ,当从子程序返回时,将从堆栈弹出2 个字节的返回地址送入IP 。当调用属性是FAR 的过程时,CPU 把当前的段寄存器CS 与指 令指针IP 的内容都压入堆栈,作为返回地址保存起来,然后将子程序的段基值与偏移量送 入CS 与IP ,当从子程序返回时,将从堆栈弹出4 个字节的返回地址分别送入IP 与CS 。 显然,当主程序和子程序处于同一逻辑段时,可以把类型属性定义为NEAR ,也可以把 类型属性定义为 FAR ,然后进行调用。而当主程序与子程序不在同一逻辑段时,只可把过 程的类型属性定义为FAR ,然后进行调用。 由于调用具有NEAR 属性的子程序只涉及IP 的变化,因而称为段内调用,相应的返回 称为段内返回。相应的,将调用具有 FAR 属性的子程序,称为段间调用,相应的返回称为 段间返回,由于这不仅涉及IP 的变化也涉及CS 的变化。 当调用指令使用子程序名进行调用时,我们称之为直接调用。当调用指令通过某寄存器 或某存储器单元指出被调用子程序的入口地址时,我们称之为间接调用。在实际使用时,直 接调用因方便清楚而用得较多。 1.段内调用 (1)段内直接调用 指

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档