分类: 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 |
上例程序执行时的堆栈变化过程下图: