第6篇 子程序结构.ppt

  1. 1、本文档共95页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 子程序结构 6.1 子程序的概念 6.2 子程序结构形式与操作 6.3 子程序的参数传送 6.4 子程序的嵌套与递归 习题6 6.1 子程序的概念 6.1.1 子程序概念 把可以多次调用、能够完成特定操作功能的程序段编写成独立的程序模块,该程序模块称为子程序,又称为过程。调用这些子程序的程序称为主程序。在主程序中,如果调用到子程序,就需要把控制转移到子程序,这个过程称为转子。子程序执行完了,要把控制再返回到主程序,这个过程称为返主。主程序与子程序之间的关系如图6.1所示。 子程序具有如下4个特性: (1) 重复性。一个子程序只占用一段存储区域,但可以多次被调用,避免了编程人员的重复劳动,又节省程序的存储空间。由于增加了调用、返回等指令,因此程序执行时间会长些。如果一个程序段只用到一次,就没有必要编写成子程序形式。 (2) 通用性。只能完成特定功能的子程序用处不大,例如,只能实现5个字节加法运算的多字节加法子程序和只能在定长字符串上查找某一固定字符的子程序都没有通用性,因而用处也就不大。要能够得到广泛应用的通用的多字节加法子程序,字节数应该是任意的,字符查找子程序、字符串的长度和查找的字符都应是任意的。 (3) 可浮动性。所谓可浮动性,就是说子程序可以存放在存储区的任何地址处。假如子程序只能存放在固定的地址处,则在编写主程序时要特别注意存储单元的分配,不要使主程序占用了子程序的存储单元而破坏掉子程序,这样就会给编程人员带来很大麻烦,而且在装配主程序和子程序时往往造成存储空间的冲突或浪费。 (4) 可递归和可重入性。如果子程序能够调用其本身,则称其可递归调用。 如果子程序可被中断,在中断处理中又被中断服务程序调用,并且能为中断服务程序和已中断的子程序两者都提供正确的结果,那么称该子程序是可重入的。 为使子程序具有可递归和可重入性,应当利用堆栈和寄存器作为中间结果的暂存器,而不能用固定的存储单元作暂存器。 6.2 子程序结构形式与操作 本小节只给出MASM提供的基本的子程序定义伪操作,从宏汇编编译程序MASM 5.1版本开始为用户提供了功能更强的子程序定义伪操作,这将在以后各有关章节加以说明。 子程序定义伪操作用在子程序的前后,使整个子程序形成清晰的、具有特定功能的代码块。其格式为 PROCEDURE NAME PROC ATTRIBUTE? PROCEDURE NAME ENDP 其中,子程序名为标识符,它又是子程序入口的符号地址。它的写法与标号的写法相同。属性(Attribute)是指子程序的类型属性,可以是NEAR或FAR。 如前所述,CALL和RET指令都有NEAR和FAR的属性。段内调用使用NEAR属性,但可以隐含;段间调用使用FAR属性。为了使用户的工作更方便,80x86的汇编程序用PROC伪操作的类型属性来确定CALL和RET指令的属性。也就是说,如果所定义的子程序是FAR属性的,那么对它的调用和返回一定都是FAR属性的; 如果所定义的子程序是NEAR属性的,那么对它的调用和返回也一定是NEAR属性的。这样,用户只需在定义子程序时考虑它的属性,而CALL和RET的属性可以由汇编程序来确定。子程序属性的确定原则很简单,即: ① 如调用程序和子程序在同一个代码段中,则使用NEAR属性; ② 如调用程序和子程序不在同一个代码段中,则使用FAR属性。 【例6-1】 调用程序和子程序在同一代码段中。 MAIN PROC FAR ;主程序 CALL SUBR1? RET MAIN ENDP SUBR1 PROC NEAR ;子程序(NEAR可省略)? RET SUBR1 ENDP 由于调用程序MAIN和子程序SUBR1在同一代码段中,所以SUBR1定义为NEAR属性。这样,MAIN中对SUBR1的调用和SUBR1中的RET就都是NEAR属性的。但是一般说来,主子程序MAIN应定义为FAR属性,这是由于把程序的主子程序看作DOS调用的一个子程序,因而DOS对MAIN的调用以及MAIN中的RET就是FRA属性的。当然,CALL和RET的属

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档