子程序的设计

子程序的调用

过程调用和过程返回指令属于程序控制这一组,通常,过程调用指令用于主程序专线子程序,过程返回之日你个用于程序返回主程序

过程调用指令有段间调用和段内调用之分,与之相对应的,过程返回也有段内返回和段间返回

过程调用指令

过程调用指令首先把子程序的返回地址(即是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

原文地址:https://www.cnblogs.com/fengdashen/p/3705142.html