zoukankan      html  css  js  c++  java
  • 主程序与子程序之间的参数传递的四种方法

    主程序调用子程序是,往往需要向子程序传递一些参数,同样,子程序运行的时候也需要把一些结果参数传回给主程序,主程序与子程序之间的这种信息传递称为参数传递,我们把主程序传给子存续的参数称为子程序的入口参数,把由子程序传给主程序的参数称为子程序的出口参数

    有多种传递参数的方法,寄存器传递法,约定内存单元传递法,堆栈传递法和CALL后续传递法

    4.2.1利用寄存器传递参数

    利用寄存器传递参数就是把参数放在约定的寄存器中,这种方法的优点是实行啊你个简单和调用方便,但是由于寄存器的个数有限,并且寄存器往往还需要存放其他数据因此只适合传递参数比较少的情况

    写一个把大写字母转换成小写字母的子程序

     1 ;子程序名 UPTOLW
     2 ;功能: 把大写字母转换成小写字母
     3 ;入口参数:AL = 字符ASCII码
     4 ;出口参数:AL = 字符ASCII码
     5 ;说明:如果字符是大写字母则转换为小写字母,其他的字符保持不变
     6 UPTOLW        PROC
     7             PUSHF
     8                         CMP AL,'A'
     9                         JB         UPTOLW1
    10                         CMP AL,'Z'
    11                         JA         UPTOLW1
    12                         ADD AL,'a' - 'A'
    13             UPTOLW1:POPF
    14                                     RET
    15             UPTOLW            ENDP
    View Code

     4.2.2利用约定的存储单元传递参数

    在传递参数较多的情况下,可以利用约定的内存变量来传递参数,这种方法的优点是子程序要处理的数据或送出的结果都有独立的存储单元,编写程序的时候不容易出错

    但是,这种方法要占用一定的存储单元并且通用性较差

    实现32位数值的相加

    ;子程序名:MADD
    ;功能: 32位数据的相加
    ;入口参数:DATA1和DATA2缓冲区中分别存放要相加的32为数据
    ;出口参数:DATA3缓冲区中的存放的结果
    ;说明:32位数据的存放采用高高低低的原则
    ;可能产生的经纬存放在DATA3开始的第5个字节中

     1 ;子程序名:MADD
     2 ;功能: 32位数据的相加
     3 ;入口参数:DATA1和DATA2缓冲区中分别存放要相加的32为数据
     4 ;出口参数:DATA3缓冲区中的存放的结果
     5 ;说明:32位数据的存放采用高高低低的原则
     6 ;可能产生的经纬存放在DATA3开始的第5个字节中
     7 ;
     8 MADD        PROC
     9                     PUSH        AX
    10                     PUSH      CX
    11                     PUSH        SI
    12                     MOV        CX,2
    13                     XOR        SI,SI
    14 MADD1:MOV        AX,WORD PTR DATA1[SI]
    15                      ADC    AX,WORD PTR DATA2[SI]
    16                      MOV    WORD PTR DATA3PSI],AX]
    17                      INC         SI
    18                      INC         SI
    19                      LOOP        MADD1
    20                      MOV        AL,0
    21                      ADC        AL,0
    22                      MOV     BYTE PTR DATA3+4,AL
    23                      POP    SI
    24                      POP        CX
    25                      POP    AX
    26                      RET
    27     MADD         ENDP
    View Code

    因为是32位数和32位数相加,因此加法运算要进行两次,首先进行低两字节的相加,然后在做高两字节相加,在高两字节相加的情况,要把

    低两字节相加的进位标志考虑进去

    4.2.3利用堆栈传递参数

    如果使用堆栈传递入口参数,那么主程序在调用子程序之前,把需要传递的参数依次压入堆栈,子程序从堆栈中取入口参数,如果使用堆栈传递出口参数,那么子程序在返回前,把需要返回的参数存入堆栈,主程序在堆栈中取出口参数即可

    利用堆栈传递参数可以不用占用寄存器,也无需额外使用存储单元,由于参数和子程序的返回地址混在一起,有事还要考虑保护寄存器,所以比较复杂,通常利用堆栈传递参数的入口参数,而利用寄存器传递出口参数

    ;子程序名:STRLEN
    ;功能:测量字符串的长度
    ;入口参数:字符串起始地址的段值和偏移在堆栈中
    ;出口参数:AX = 字符串长度

     1 ;子程序名:STRLEN
     2 ;功能:测量字符串的长度
     3 ;入口参数:字符串起始地址的段值和偏移在堆栈中
     4 ;出口参数:AX = 字符串长度
     5 
     6 STRLEN        PROC
     7                         PUSH  BP
     8                         MOV       BP,SP
     9                         PUSH  DS
    10                         PUSH  SI
    11                         MOV   DS,[BP+6]
    12                         MOV   SI,[BP+4]
    13                         MOV AL,0
    14     STRLEN1:CMP AL,[SI]
    15                         JZ  STRLEN2
    16                         INC  SI
    17                         JMP STRLEN1
    18     STRLEN2:MOV AX,SI
    19                         SUB   AX,[BP+4]
    20                         POP   SI
    21                         POP   DS
    22                         POP   BP
    23                         RET
    24         STRLEN   ENDP
    View Code

     4.2.4利用CALL后续区传递参数

    CALL后续曲是指位于CALL指令后的存储区,主程序在调用子程序之前,把入口参数存入CALL指令后面的存储区,子程序根据保存在堆栈中的返回地址找到入口参数,这种传递参数的方法称为CALL后续传递参数法,由于这种方法吧数据和代码混在一起,在x86系列中使用的不多

    版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3705271.html

  • 相关阅读:
    项目实战:Qt+Android模拟操作器(模拟操作app,打开,点击,输入,获取验证码等等)
    项目实战:流水线图像显示控件(列刷新、1ms一次、缩放、拽拖、拽拖预览、性能优化、支持OpenGL GPU加速)
    OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体
    Oracle数据库由dataguard备库引起的log file sync等待
    使用udev高效、动态的管理Linux设备文件
    Linux配置和管理设备映射多路径multipath
    ELK6环境搭建
    存储系列1-openfiler开源存储管理平台实践
    redhat / centos开启关闭防火墙
    教你如何使用github+jsDelivr搭建免费图床
  • 原文地址:https://www.cnblogs.com/fengdashen/p/3705271.html
Copyright © 2011-2022 走看看