子程序的调用
过程调用和过程返回指令属于程序控制这一组,通常,过程调用指令用于主程序专线子程序,过程返回之日你个用于程序返回主程序
过程调用指令有段间调用和段内调用之分,与之相对应的,过程返回也有段内返回和段间返回
过程调用指令
过程调用指令首先把子程序的返回地址(即是CALL指令的下一条指令的地址)压入堆栈,以便于执行完子程序之分返回调用程序继续往下执行,然后转移到子程序的入口地址去执行子程序
过程调用分为四种
【1】段内直接调用:格式 call 过程名
例如:CALL SUB1
CALL TOASCII
该指令具体分解为SP = SP -2,[SP] = IP ,IP = IP+disp
段内直接调用指令只把返回地址的偏移量压入堆栈保存,实际上转移发生在同一段内,代码段寄存器CS的内容不发生变化,然后把地址与子程序入口地址的差值加到指令指针IP上,使指令指针IP为目标地址发生偏移,从而达到转移的目的
地址差 = 目标地址到CALL指令下一跳指令开始的地址差
【2】段内间接调用,格式如下:CALL OPRD
OPRD是16位通用寄存器或字存储器操作数,该指令具体分解如下:SP = SP -2,[SP] = IP, IP = OPRD
该指令只把返回地址的偏移量压入堆栈保存,如果OPRD是16为通用寄存器,则把寄存器的内容送到IP,如果OPRD是字存储操作数,则把字存储单元内的内容送到IP
【3】段间直接调用 格式 CALL 过程名
指令首先把返回地址的段值压入堆栈,再把返回地址的偏移量压入堆栈,达到保存地址的目的,过程调用的入口地址的段值和偏移量分别送给CS和IP,达到转移的目的,该指令进行的具体操作分解如下 SP = SP -2,[SP] = CS,SP = SP -2,[SP] = IP,IP = 过程调用地址入口,CS = 过程入口地址的段值
CALL FAR PTR SUBRO 如果先调用后定义,那么为难调用成功必须在过程名前面加入 FAR PTR
【4】段间间接调用 CALL OPRD OPRD必须是双字存储单元,
该指令具体操作可分解如下: SP = SP -2,[SP] = CS ,SP = SP-2,[SP] = IP,IP = OPRD的低字节,CS = OPRD的高字节
例如 CALL DWORD PTR [BX]
过程返回指令
【1】段内返回指令RET,指令实际上执行的是IP = [SP],SP = SP +2
【2】段间返回指令RETF IP = [SP],SP = SP+2,CS = [SP],SP = SP +2
【3】段内带立即数返回指令 RET 表达式
例如RET 4
执行指令的时候,IP = SP ,SP = SP+2,SP =SP+4
如果执行前SP = B67EH,执行完之后SP =B68H
子程序说明信息
为了能正确的使用子程序,再给出子程序代码时候还需要给出子程序的说明信息,子程序的说明信息一般包括如下几部分组成
【1】子程序名
【2】功能描述
【3】入口和出口参数
【4】所用的寄存器和存储单元
【5】使用的算法和重要的性能指标
【6】其他调用注意事项和说明信息
【7】调用实例
过程定义的语句
过程名 PROC [NEAR|FAR]
……………………
过程名 ENDP
过程名的段值和偏移是对应过程的入口(过程丁一开始伪指令语句后的指令的段值和偏移)过程名的类型就是过程的类型
版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3705142.html
原文地址:http://www.cnblogs.com/fengdashen/p/3705142.html