汇编参数传递

来源:互联网 发布:淘宝pc端怎么看微淘 编辑:程序博客网 时间:2024/04/29 17:06

主程序在调用子程序时,往往要向子程序传递一些参数;同样,子程序运行后也经常要把一些结果参数传回给主程序。主程序与子程序之间的这种信息传递称为参数传递。
     参数传递有四种方法:寄存器参数传递,约定存储单元参数传递,利用CALL后续区进行参数传递,利用堆栈进行参数传递。
一、寄存器参数传递
优点是实现简单方便,调用方便,但是寄存器个数有限,且寄存器往往还要存放其他数据,所以只适合用于要传递的参数较少的情况。
程序示例,这里就不举例了,利用到这种参数传递的例子有很多。
例如,利用ax传入一个16位数,转化为字符串并输出。
二、利用约定存储单元传递参数
这种数据传递方式,数据在内存中,通常在数据段中,相当于全局变量。例如,使用一个字符串变量作为参数,传入函数,输出一个16进制数。
三、利用堆栈传递参数
实现方法:主程序在调用子程序之前,将需要传递的参数依次压入堆栈,子程序从堆栈中取入口参数;子程序调用结束之前,将需要返回的参数依次压入堆栈,主程序在堆栈中取出参数。
示例:测量字符串长度的子程序,设字符串以0为结束标志
;输入参数通过堆栈传递参数
;输出参数通过寄存器传递参数

data segmentstr db '123456789',0len dw ?data endscode segmentassume ds:data,cs:codestart:mov ax,seg strpush axmov ax,offset strpush axcall strlenmov len,axmov ah,4chint 21hcode endsstrlen procpush bpmov bp,sppush dspush simov ds,[bp+6] ;将串的段值,加载到数据段寄存器mov si,[bp+4] ;将串的偏移,传给si,为读串做准备mov al,0strlen1: cmp al,[si]jz strlen2inc sijmp strlen1strlen2: mov ax,sisub ax,[bp+4]pop sipop dspop bpret 4strlen endpend start
四、利用CALL后续区传递参数
数据在代码段中,很少语言使用此方法,但使用方法接近于高级语言。
示例:测量字符串长度的子程序,设字符串以0为结束标志
;输入参数通过CALL后续区传递参数
;输出参数通过寄存器传递参数

data segmentstr db '123456789',0len dw ?data endscode segmentassume ds:data,cs:codestart:call strlendw offset strdw seg strmov len,axmov ah,4chint 21hcode endsstrlen procpush bpmov bp,sppush dspush simov si,[bp+2] ;将子程序返回地址,传给si,方便参数传递mov ds,cs:[si+2] ;将串的段值,加载到数据段寄存器mov si,cs:[si] ;将串的偏移,传给si,为读串做准备mov dx,simov al,0strlen1: cmp al,[si]jz strlen2inc sijmp strlen1strlen2: sub si,dxadd word ptr [bp+2],4;修改返回地址pop sipop dspop bpret 4strlen endpend start

0 0
原创粉丝点击