四种传递参数的方法

主程序在调用子程序时,往往要向子程序传递一些参数;同样,子程序运行后也经常要把一些结果参数传回给主程序。主程序与子程序之间的这种信息传递称为参数传递。
  参数传递有四种方法:寄存器参数传递,约定存储单元参数传递,利用CALL后续区进行参数传递,利用堆栈进行参数传递。

一、寄存器参数传递
优点是实现简单方便,调用方便,但是寄存器个数有限,且寄存器往往还要存放其他数据,所以只适合用于要传递的参数较少的情况。
程序示例,这里就不举例了,利用到这种参数传递的例子有很多。
例如,利用ax传入一个16位数,转化为字符串并输出。

二、利用约定存储单元传递参数
这种数据传递方式,数据在内存中,通常在数据段中,相当于全局变量。例如,使用一个字符串变量作为参数,传入函数,输出一个16进制数。

三、利用堆栈传递参数

实现方法:主程序在调用子程序之前,将需要传递的参数依次压入堆栈,子程序从堆栈中取入口参数;子程序调用结束之前,将需要返回的参数依次压入堆栈,主程序在堆栈中取出参数。
示例:测量字符串长度的子程序,设字符串以0为结束标志
;输入参数通过堆栈传递参数
;输出参数通过寄存器传递参数
data segment
 str db '123456789',0
 len dw ?
data ends
code segment
assume ds:data,cs:code
start:
 mov ax,seg str
 push ax
 mov ax,offset str
 push ax
 call strlen
 mov len,ax
 mov ah,4ch
 int 21h
code ends
strlen proc
 push bp
 mov bp,sp
 push ds
 push si
 mov ds,[bp+6] ;将串的段值,加载到数据段寄存器
 mov si,[bp+4] ;将串的偏移,传给si,为读串做准备
 mov al,0
strlen1: cmp al,[si]
 jz strlen2
 inc si
 jmp strlen1
strlen2: mov ax,si
 sub ax,[bp+4]
 pop si
 pop ds
 pop bp
 ret 4
strlen endp
end start

四、利用CALL后续区传递参数
数据在代码段中,很少语言使用此方法,但使用方法接近于高级语言。
示例:测量字符串长度的子程序,设字符串以0为结束标志
;输入参数通过CALL后续区传递参数
;输出参数通过寄存器传递参数
data segment
 str db '123456789',0
 len dw ?
data ends
code segment
assume ds:data,cs:code
start:
 call strlen
 dw offset str
 dw seg str
 mov len,ax
 mov ah,4ch
 int 21h
code ends
strlen proc
 push bp
 mov bp,sp
 push ds
 push si
 mov si,[bp+2] ;将子程序返回地址,传给si,方便参数传递
 mov ds,cs:[si+2] ;将串的段值,加载到数据段寄存器
 mov si,cs:[si] ;将串的偏移,传给si,为读串做准备
 mov dx,si
 mov al,0
strlen1: cmp al,[si]
 jz strlen2
 inc si
 jmp strlen1
strlen2: sub si,dx
 add word ptr [bp+2],4;修改返回地址
 pop si
 pop ds
 pop bp
 ret 4
strlen endp
end start
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值