分类: WINDOWS
2007-10-24 14:03:47
高级语言使用堆栈传递参数的例子(Pascal编译器为例)
参考来自《80x86汇编语言程序设计-王成耀 编》
大多数高级语言使用堆栈传递参数。例如Pascal编译器将参数以从左到右的顺序进栈,Pascal过程调用
PascalProc(i,j,k+4);
在编译后,通常会生成下列80x86代码(假定i、j、k均为整数,占两个字节,且采用值传递):
push i | |
push j | |
mov ax,k | |
add ax,4 | |
push ax | |
call PascalProc |
例一:已知Pascal过程
procedure PasProc(var i:integer;j,k:interger); | |
begin |
|
i:=j+k; | |
end; |
及调用语句
PasProc(a,3,4);
其中,参数j和k为值传递,i为引用传递。设过程类型为FAR,整数integer占两个字节,并使用32位分段地址传递引用参数。则等价的汇编语言代码如下。
(1) 过程PasProc
PasProc_i |
equ 10[bp] |
|||
PasProc_j |
equ 8[bp] |
|||
PasProc_k |
equ 6[bp] |
|||
PasProc proc far |
||||
push bp |
||||
mov bp,sp |
||||
push es |
||||
push ax |
||||
push bx |
||||
les bx,PasProc_i |
;取参数i的地址,存入ES:BX | |||
mov ax,PasProc_j |
;取参数j |
|||
add ax,PasProc_k |
;参数j与k相加 | |||
mov es:[bx],ax |
;存结果到i的地址处 | |||
pop bx |
||||
pop ax |
||||
pop es |
||||
pop bp |
||||
ret 8 |
||||
PasProc endp |
由于参数i采用引用传递,调用前必须将其地址进栈。尽管只有三个参数,但应用参数i占了4个字节,因此,堆栈中的参数共占用8个字节,故使用指令RET 8返回。
(2)调用语句
mov ax,seg a | |
push ax | |
mov ax,offset a | |
push ax | |
mov ax,3 | |
push ax | |
mov ax,4 | |
push ax | |
call PasProc |
8086以上的CPU可以使用下列代码:
push seg a | |
push offset a | |
push 3 | |
push 4 | |
call PasProc |