- 1、本文档共41页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编语言程序设计-------朱耀庭 第11章 过程 在编写程序时,常常发现在若干不同的点上都需要一个特定的指令序列,如果把这个指令序列插到程序中的每一个需要点上,必然会使程序的规模大大增加。程序员可以利用过程编程方法解决这个问题。将某个反复在程序中出现的程序片段设计成过程,缩短程序长度,节约存储空间。将某个具有通用性的程序片段设计成过程,实现许多程序共享,可以大大减少程序设计的工作量。另外,当某个程序片段的功能相对独立时,也可以把它设计成过程,这样便于模块化、调试和修改。 本章详细论述过程的定义,过程的调用方法,并通过大量的实例进行说明。 第11章 过程 11.1 过程的定义与说明 1. 过程的定义 过程也称作子程序。将这一特定的指令序列编成一个过程的方法,称作“过程定义”。用一对伪指令PROC/ENDP定义一个过程,其格式如下: PROCNAME PROC [NEAR/FAR] … ;过程体 RET PROCNAME ENDP 其中:PROCNAME是PROC和ENDP伪指令前面必须有的同一个过程的名称。在一个过程定义中,ENDP前面的过程名一定要和PROC前面的过程名一致,并且必须是合法的标识符。 1. 过程的定义 伪指令PROC和ENDP必须成对出现,表示过程的开始和结束。 过程可以被指定为NEAR或FAR类型。如果没有指定,就认为是NEAR类型。如果一个过程要被别的程序跨段调用,就应将该过程说明为FAR类型。如果一个过程定义时被指明为NEAR类型或使用缺省类型说明,那么该过程仅能被本过程所在段的程序所调用。 在一个过程中至少有一个RET返回指令。RET指令为过程的出口点,过程由该点结束本次过程调用,返回到调用者调用该过程的下一条指令继续程序的执行。 2. 过程的说明 编写过程的重要一环就是书写过程的说明信息,这样可以让不熟悉该过程的用户仍能正确快速地使用。 过程的说明信息一般包括过程名称、功能、入口出口参数等。 更详细的说明还包括存储单元、所用寄存器、作者、编写时间等内容 2. 过程的说明 例11-1 过程说明实例。 题目:主程序从键盘读入一个字符,如果是小写字母转化为大写字母输出,不是小写字母则直接输出。然后再继续下一个读入和转换,直到遇到输入为回车符结束。用户在程序运行时可以输入不同字符验证其正确性。 设计思路:主程序用过程形式开始,以RET返回。主程序输入的非回车符调用过程UPPERCASE转换为大写字母后送入AL中返回并输出,如果输入回车符则结束。 11.2 过程调用 过程一经定义,在程序中每一个需要这一指令序列的位置都可以使用这个过程,对一个过程的使用称作“过程调用”。过程调用需要使用CALL指令。CALL指令的用法如下: CALL PARA 其中PARA可以是一个过程名、间接寻址的寄存器或者是内存地址。 过程调用分为两种类型:近过程调用(NEAR)和远过程(FAR)调用。汇编程序产生哪一种类型的CALL指令,取决于程序员所定义的过程名是NEAR类型还是FAR类型。 近过程调用是指过程调用代码段和过程定义代码段位于同一代码段。当CALL指令产生一个近过程调用时,它把该指令之后的下一条指令地址压栈,即把返回地址的偏移量(16位)压栈,以供过程定义中的RET(返回指令)能将控制转回到CALL的下一条指令。 11.2 过程调用 类似地,当过程调用代码段和过程定义代码段不在同一代码段时,则CALL指令会产生一个远过程调用。不同的是,当CALL指令产生远过程调用时,不仅要把该指令之后的地址压栈,即把返回地址的偏移量压栈,而且也要把其段寄存器CS的值压栈。 不同形式的CALL指令允许从指令中获得目标过程的入口地址(直接CALL),或从指令指定的存储单元或寄存器中获得目标过程的入口地址(间接CALL)。在保存断点进栈操作以前,处理器自动地修改IP或CS与IP以使它指向要执行的下一条指令。 具体格式与JMP指令相似,也有4种格式:段内直接调用、段内间接调用、段间直接调用、段间间接调用 11.2 过程调用 1.段内直接调用 格式:CALL PROCNAME 功能:其中PROCNAME是已经定义的近过程名。执行CALL指令调用时,首先保护返回地址,即将返回地址压栈,返回地址就是CALL指令所在位置的下一条指令的地址;保护好返回地址后将控制转移给过程。保护返回地址的具体操作是:SP(堆栈栈顶指针)减2,并将IP(指令指针)的内容压入堆栈;将控制转移给过程的具体操作是:将目标过程入口相对于CALL指令的相对位移量(-32K~+32K)加到指令
文档评论(0)