• 子程序的设计


    子程序的调用

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

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

    过程调用指令

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

  • 相关阅读:
    windows下的SASS/Compass的安装与卸载
    玩转HTML5移动页面(优化篇)
    小谈数组去重
    前端问题解答
    JavaScript使用封装
    JavaScript使用接口
    JavaScript精要(系列)
    JavaScript DOM节点和文档类型
    JavaScript数组类型
    JavaScript函数表达式
  • 原文地址:https://www.cnblogs.com/fengdashen/p/3705142.html
Copyright © 2020-2023  润新知