《汇编语言程序设计》第十一章:过程

上传人:tian****1990 文档编号:75822658 上传时间:2019-02-01 格式:PPT 页数:41 大小:1.74MB
返回 下载 相关 举报
《汇编语言程序设计》第十一章:过程_第1页
第1页 / 共41页
《汇编语言程序设计》第十一章:过程_第2页
第2页 / 共41页
《汇编语言程序设计》第十一章:过程_第3页
第3页 / 共41页
《汇编语言程序设计》第十一章:过程_第4页
第4页 / 共41页
《汇编语言程序设计》第十一章:过程_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《《汇编语言程序设计》第十一章:过程》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》第十一章:过程(41页珍藏版)》请在金锄头文库上搜索。

1、汇编语言程序设计 -朱耀庭,,南开大学 朱耀庭,,第11章 过程,在编写程序时,常常发现在若干不同的点上都需要一个特定的指令序列,如果把这个指令序列插到程序中的每一个需要点上,必然会使程序的规模大大增加。程序员可以利用过程编程方法解决这个问题。将某个反复在程序中出现的程序片段设计成过程,缩短程序长度,节约存储空间。将某个具有通用性的程序片段设计成过程,实现许多程序共享,可以大大减少程序设计的工作量。另外,当某个程序片段的功能相对独立时,也可以把它设计成过程,这样便于模块化、调试和修改。 本章详细论述过程的定义,过程的调用方法,并通过大量的实例进行说明。,南开大学 朱耀庭,,第11章 过程,11

2、.1过程的定义与说明,11.2 过程调用,11.3 过程的返回,11.4 模块间的调用和转移,11.5寄存器的保护和恢复,11.6调用程序与被调用过程之间的数据传送,11.7 递归,11.8 C语言调用汇编过程,南开大学 朱耀庭,,11.1 过程的定义与说明,南开大学 朱耀庭,,1. 过程的定义,过程也称作子程序。将这一特定的指令序列编成一个过程的方法,称作“过程定义”。用一对伪指令PROC/ENDP定义一个过程,其格式如下: PROCNAME PROC NEAR/FAR ;过程体 RET PROCNAME ENDP 其中:PROCNAME是PROC和ENDP伪指令前面必须有的同一个过程的名称

3、。在一个过程定义中,ENDP前面的过程名一定要和PROC前面的过程名一致,并且必须是合法的标识符。,南开大学 朱耀庭,,1. 过程的定义,伪指令PROC和ENDP必须成对出现,表示过程的开始和结束。 过程可以被指定为NEAR或FAR类型。如果没有指定,就认为是NEAR类型。如果一个过程要被别的程序跨段调用,就应将该过程说明为FAR类型。如果一个过程定义时被指明为NEAR类型或使用缺省类型说明,那么该过程仅能被本过程所在段的程序所调用。 在一个过程中至少有一个RET返回指令。RET指令为过程的出口点,过程由该点结束本次过程调用,返回到调用者调用该过程的下一条指令继续程序的执行。,南开大学 朱耀庭

4、,,2. 过程的说明,编写过程的重要一环就是书写过程的说明信息,这样可以让不熟悉该过程的用户仍能正确快速地使用。 过程的说明信息一般包括过程名称、功能、入口出口参数等。 更详细的说明还包括存储单元、所用寄存器、作者、编写时间等内容,南开大学 朱耀庭,,2. 过程的说明,例11-1 过程说明实例。 题目:主程序从键盘读入一个字符,如果是小写字母转化为大写字母输出,不是小写字母则直接输出。然后再继续下一个读入和转换,直到遇到输入为回车符结束。用户在程序运行时可以输入不同字符验证其正确性。 设计思路:主程序用过程形式开始,以RET返回。主程序输入的非回车符调用过程UPPERCASE转换为大写字母后送

5、入AL中返回并输出,如果输入回车符则结束。,例11-1 过程说明实例,程序说明:主程序也可以不定义为过程,这时必须以INT 21H的4CH号功能调用结束,南开大学 朱耀庭,,11.2 过程调用,过程一经定义,在程序中每一个需要这一指令序列的位置都可以使用这个过程,对一个过程的使用称作“过程调用”。过程调用需要使用CALL指令。CALL指令的用法如下: CALL PARA 其中PARA可以是一个过程名、间接寻址的寄存器或者是内存地址。 过程调用分为两种类型:近过程调用(NEAR)和远过程(FAR)调用。汇编程序产生哪一种类型的CALL指令,取决于程序员所定义的过程名是NEAR类型还是FAR类型。

6、 近过程调用是指过程调用代码段和过程定义代码段位于同一代码段。当CALL指令产生一个近过程调用时,它把该指令之后的下一条指令地址压栈,即把返回地址的偏移量(16位)压栈,以供过程定义中的RET(返回指令)能将控制转回到CALL的下一条指令。,南开大学 朱耀庭,,11.2 过程调用,类似地,当过程调用代码段和过程定义代码段不在同一代码段时,则CALL指令会产生一个远过程调用。不同的是,当CALL指令产生远过程调用时,不仅要把该指令之后的地址压栈,即把返回地址的偏移量压栈,而且也要把其段寄存器CS的值压栈。 不同形式的CALL指令允许从指令中获得目标过程的入口地址(直接CALL),或从指令指定的存

7、储单元或寄存器中获得目标过程的入口地址(间接CALL)。在保存断点进栈操作以前,处理器自动地修改IP或CS与IP以使它指向要执行的下一条指令。 具体格式与JMP指令相似,也有4种格式:段内直接调用、段内间接调用、段间直接调用、段间间接调用,南开大学 朱耀庭,,11.2 过程调用,1段内直接调用 格式:CALL PROCNAME 功能:其中PROCNAME是已经定义的近过程名。执行CALL指令调用时,首先保护返回地址,即将返回地址压栈,返回地址就是CALL指令所在位置的下一条指令的地址;保护好返回地址后将控制转移给过程。保护返回地址的具体操作是:SP(堆栈栈顶指针)减2,并将IP(指令指针)的内

8、容压入堆栈;将控制转移给过程的具体操作是:将目标过程入口相对于CALL指令的相对位移量(-32K32K)加到指令指针IP中去。 例11-1就是如此。请同学们解释其调用和返回过程,南开大学 朱耀庭,,11.2 过程调用,2段内间接调用 格式:CALL OPRD 功能:其中OPRD是16位通用寄存器或字存储器操作数。执行该指令调用时,首先保护返回地址,将返回地址的偏移部分压入堆栈;然后将控制转移给过程。保护返回地址的具体操作是:SP减2,并将IP的内容压入堆栈。将控制转移的具体操作是:从CALL指令中指定的16位通用寄存器或字存储器中获得目标过程的入口地址(位移量),并用此地址替换IP的内容。 例

9、如: CALL WORD PTRBX CALL WORD_VARLABEL_NAME CALL WORD PTRBX+SI+2 CALL WORD PTRDI CALL WORD_VARLABEL_NAMEBPSI CALL BX,南开大学 朱耀庭,,2. 过程的说明,例11-2段内间接调用实例一 题目:输入1、2、3分别对应输出R、G、B,输入其他符号则结束 设计思路:设计3个过程pr、pg、pb分别输出R、G、B字符。主程序根据输入1、2、3分别用BX指向对应过程入口,通过段内间接调用实现过程调用,例11-2段内间接调用实例一,程序说明:过程pr、pg、pb均为近过程,因此调用时仅需修改I

10、P实现调用。 需要注意的是过程的调用方法。上述代码注释部分分别将几个过程入口地址的IP值送入寄存器BX中,通过语句call bx调用对应过程,属于段内间接调用。,南开大学 朱耀庭,,2. 过程的说明,例11-3段内间接调用实例二 题目:同例11-2 设计思路:与例11-2不同的是定义表table,其中3个字分别存放过程pr 、pg和pb的位移。主程序通过输入的数字n,计算(n-1)*2,从table中得到该位移,然后调用对应的过程,例11-3 段内间接调用实例二,程序说明:与例11-2不同的是通过内存间接寻址调用过程,南开大学 朱耀庭,,11.2 过程调用,3段间直接调用 格式:CALL PR

11、OCNAME 功能:其中PROCNAME是已经定义的远过程名。执行CALL指令调用时,CALL指令的功能是首先保护返回地址,然后将控制转移给远过程。保护返回地址的具体操作是:SP减2,将CS的内容压入堆栈;然后SP减2,将IP的内容压入堆栈。目标过程为FAR类型的过程,段间直接调用属于远调用,因此,将控制转移给远过程的具体操作是:将被调用过程所在段的段基址送入CS中,将被调用过程相对于其所在段的位移量送入IP中,以实现控制转移。,南开大学 朱耀庭,,2. 过程的说明,例11-4段间直接调用实例 题目:主程序从键盘读入一个字符,如果是小写字母转化为大写字母输出,不是小写字母直接输出。然后再输入下

12、一字符继续上述工作,直到输入回车结束 设计思路:与例11-1不同的是主程序和它所调用的过程分别放在不同的代码段,而不是在同一个代码段,例11-4 段间直接调用实例,程序说明:本例中UPPERCASE过程与调用它的主过程不在同一个代码段中,分别处于CODE1和CODE2段。所以UPPERCASE过程使用了FAR关键字定义为远过程,这样在不同的代码段就可以直接调用该过程,南开大学 朱耀庭,,11.2 过程调用,4段间间接调用 格式:CALL OPRD 功能:其中OPRD是双字存储器操作数。执行该指令调用时,首先保护返回地址,即把返回地址的段基址和偏移地址分别压入堆栈保存,然后将控制转移给远过程。保

13、护返回地址的具体操作是:SP减2,将CS的内容压入堆栈,然后SP减2,将IP的内容压入堆栈。将控制转移的具体操作是:把双字存储器操作数的低字送入IP中,把双字存储器操作数的高字送入CS中,从而实现远转移。段间间接调用只能通过双字存储器进行,而不能通过寄存器进行。 例如: CALL DWORD PTRBX CALL DWORD_VARLABEL_NAMESI CALL DWORD_VARLABEL_NAME,南开大学 朱耀庭,,2. 过程的说明,例11-5段间间接调用实例。 题目:同例11-2和例11-3。 设计思路:与例11-3不同的仅仅是主程序与它所调用的过程不在同一个代码段,例11-5 段

14、间间接调用实例,程序说明:本例与例11-3的功能类似,主要区别在于子过程与主过程不在同一代码段,所以过程定义需要使用FAR关键字,属于段间间接调用,南开大学 朱耀庭,,11.3 过程的返回,过程调用时调用者将控制转移给过程,当过程执行完后,过程又会将控制返回给调用者,从调用过程的那个位置的下一条指令继续执行,实现“过程返回”。在一个过程中至少有一个RET(返回)指令被执行到。RET指令为过程的出口点,从此处返回调用过程的位置。 格式: RET或 RET n 其中n 是在弹出返回地址后,从堆栈中删除字节的个数。 功能:过程的返回和调用在功能上是互逆的。所以过程的返回也分为远返回和近返回。返回指令

15、在堆栈操作方面是调用指令的逆过程。,南开大学 朱耀庭,,11.3 过程的返回,具体操作如下: (1) 近返回:RET指令将SP所指向的栈顶字(断点的位移量)弹出送至指令指示器IP中,并将SP加2 (2) 远返回:RET指令先弹出栈顶之值送到IP中,再弹出栈顶之值送到CS中,并再将SP加4,南开大学 朱耀庭,,11.3 过程的返回,如果选用RET n的格式,RET指令在完成RET的以上功能外,将n加到SP上去,即SP内容加n送入SP中,以废除调用过程时调用程序装入栈中的参数,使之恢复调用之前的栈顶。例如,指令:RET 4,除了返回到调用程序的断点处,并恢复到调用过程指令CALL之前的栈顶外,还要将4加到SP上去,以废除两个参数所占用的堆栈空间(这两个参数是为所调用的过程提供的)。因为堆栈是以字为单位的,而RET中的弹出值是字节数,因此,若废除n个参数,则弹出值应为2n(即为偶数)。 RET n格式往往用于带参数的过程的参数传递,特别是其他语

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号