Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1400712
  • 博文数量: 416
  • 博客积分: 13005
  • 博客等级: 上将
  • 技术积分: 3297
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 16:26
文章分类

全部博文(416)

文章存档

2014年(1)

2013年(4)

2012年(46)

2011年(64)

2010年(12)

2009年(4)

2008年(40)

2007年(187)

2006年(58)

分类: WINDOWS

2007-10-23 16:27:38

6.2.4

用堆栈传递参数

调用者通过调整堆栈指针为返回参数预留空间,然后将过程所需的入口参数进栈;

过程从堆栈得到入口参数,返回前将出口参数写入堆栈;

调用者通过出栈得到返回参数。

过程从堆栈存取参数时,通常使用BP,因为其隐含的段地址在SS中。

采用堆栈传递参数时,典型的过程结构如下:

StdProc   proc   near

                push              bp

                mov    bp, sp                   ; BP指向当前栈顶,用于取入口参数

                ...

                pop              bp

               ret         ParmSize               ; 返回前从堆栈移出入口参数

StdProc       endp

        其中,ParmSize是过程被调用前进栈的入口参数的字节

 

 

DESG SEGMENT

COUNT

DW 5

;DW1个字,即16bit或两个字节

ARRAY

DW 8,-1,32766,0,100

;32766=7FFEH

MAX

DW ?

DESG ENDS

SSEG SEGMENT

DW 512 DUP(0)

SSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG,SS:SSEG

START:

MOV AX,DSEG

MOV DS,AX

SUB SP,2

;为返回参数预留一个字

MOV AX,SEG ARRAY

PUSH AX

;数组段地址进栈

MOV AX,OFFSET ARRAY

PUSH AX

;数组偏移地址进栈

PUSH COUNT

;元素个数进栈

;(a)

CALL FINDMAX

;(f)

POP MAX

;得到返回的最大值

MOV AH,4CH

INT 21H

PARMCOUNT

EQU 4[BP]

;使用EQU,以便在过程中使用符号名

PARMARRAY

EQU 6[BP]

PARMMAX

EQU 10[BP]

FINDMAX PROC

;(b)

MINSW

= 8000H

;16位带符号数的最小值

PUSH BP

MOV BP,SP

;(c)

PUSH AX

PUSH BX

PUSH CX

PUSH DS

;(d)

LDS BX,PARMARRAY

;取数组首地址

MOV CX,PARMCOUNT

;取元素个数

MOV AX,MINSW

NEXT:

CMP AX,[BX]

JG SKIP

MOV AX,[BX]

SKIP:

ADD BX,2

LOOP NEXT

MOV PARMMAX,AX

;存入出口参数

POP DS

POP CX

POP BX

POP AX

POP BP

;(f)

RET 6

FINDMAX ENDP

CSEG ENDS

END START

上例程序执行时的堆栈变化过程下图:

阅读(1118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~