- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
汇编语言第5章王爽版〔子程序调用指令〕
第5章 结构化程序设计 5.1 子程序的概念 5.2 子程序的定义、调用和返回 ** 5.3 子程序的现场保护与参数传递** 5.4 子程序设计 * 5.5 子程序的嵌套与递归调用 5.6 宏汇编程序设计 5.1 子程序的概念 1、子程序:在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 过程(子程序):是指功能相对独立的一段程序。 主程序和子程序间的关系:调用子程序的程序称为主调程序或主程序,被调用的程序称为子程序。 5.2 子程序的定义、调用和返回 1、子程序的定义:由子程序定义伪指令PROC和ENDP来完成。其格式如下: 子程序名 PROC [NEAR/FAR] ┆ ;过程体 子程序名 ENDP 解释:(1)子程序名是子程序入口地址的符号表示。同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。 (2)PROC表示子程序定义开始,ENDP表示子程序定义结束。 (3) NEAR/FAR 2、子程序的调用和返回 过程定义后,可在主程序中用CALL指令,反复调用。 过程结束,由返回指令RET返回主程序。 主程序与子程序 子程序调用指令(CALL) CALL指令分成4种类型 CALL子程序名 ;段内直接调用 CALL r16/m16 ;段内间接调用 CALL far ptr子程序 ;段间直接调用 CALL far ptr mem ;段间间接调用 CALL指令需要保存返回地址: 段内调用——偏移地址IP入栈 SP←SP-2,SS:[SP]←IP 段间调用——偏移地址IP和段地址CS入栈 SP←SP-2,SS:[SP]←CS SP←SP-2,SS:[SP]←IP 子程序返回指令(RET) RET [n] 功能:弹出CALL指令压入堆栈的返回地址 段内返回——偏移地址IP出栈 IP←SS:[SP], SP←SP+2 段间返回——偏移地址IP和段地址CS出栈 IP←SS:[SP],SP←SP+2 CS←SS:[SP],SP←SP+2 子程序返回指令(RET) 放在子程序的末尾,它使子程序在执行完任务后将堆栈中的断点弹出,控制程序返回主程序继续执行被打断的程序。而返回地址(断点)就是子程序调用时入栈保护的断点地址IP(段内调用)或IP和CS值(段间调用)。通常,RET指令的类型是隐含的,它自动与子程序定义时的类型相匹配,如果是段内,返回时将栈顶的一个字弹给IP寄存器;如为段间,返回时先从栈顶弹出一个字给IP,接着再弹出一个字给CS。但是,当采用间接调用时,必须注意:保证CALL指令的类型与过程中RET指令的类型匹配,以免发生错误。例如CALL WORD PTR[BX]只能是段内调用,而CALL DWORD PTR[BX]能够调用一个远过程(段间调用),这样RET才能够识别返回类型。 子程序的位置通常在主程序的所有可执行指令之前或之后,不能放在主程序的可执行指令序列内部,否则会破坏主程序结构 5.3子程序的现场保护与参数传递 PROG PROC PUSH AX PUSH BX PUSH CX ;保护现场 PUSH DX ┆ ┆ POP DX POP CX POP BX ;恢复现场 POP AX RET ;返回断点处 PROG ENDP 二、主程序与过程的参数传递方式 主程序-子程序的参数传递: 入口参数—— 也称入口条件,是指主程序调用子程序前,为子程序内部数据处理准备所需的预置值; 出口参数—— 也称出口条件,是子程序返回主程序后,把子程序处理的结果传递给主程序的数据。 参数传递的基本方法有: (1)寄存器法:通过CPU寄存器传递参数。传递数据方便、快捷,但所能传递的数据长度和个数都有限。 (2)变量法:通过内存单元(组)传递参数。传递数据的长度和个数可不受限制,程序设计比较灵活。 (3)堆栈法:通过堆栈传递参数。用堆栈保存所要传递的数据或存储地址,利用堆栈数据存取的特点,是常用的参数传递方法。 例5-2:多字节数相加的程序(寄存器传递过程参数) data segment num1 db 01h,02h,03h,04h,05h,06h num2 db 0ffh,07h,0ffh,03h,01h,06h len equ $- num2 data ends stack segment stack dw 10
文档评论(0)