分类: 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 |
;DW:1个字,即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 |
||
上例程序执行时的堆栈变化过程下图:
