- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)段内直接调用
指
您可能关注的文档
最近下载
- (试题)基础考试电机与拖动精选试题及答案.docx VIP
- 飞机复合材料结构修理 复合材料结构修理准则及修理流程 1 复合材料结构修理准则.pptx VIP
- DBJ50T-522-2025建筑分布式光伏电站消防技术标准.pdf VIP
- 电子技术基础(张龙兴版)全套课件_(4).ppt VIP
- 医疗器械经营质量管理制度、工作程序等目录.pdf VIP
- 2024年武汉市江岸区招聘社区干事真题.docx VIP
- 护理防跌倒坠床课件.pptx VIP
- 医德医风教育及医疗纠纷防范.ppt VIP
- 长沙市芙蓉区事业单位真题2023.docx VIP
- GB-T 16494-2013 化学试剂 二甲苯.pdf
文档评论(0)