Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1353027
  • 博文数量: 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-24 14:03:47

高级语言使用堆栈传递参数的例子(Pascal编译器为例)

参考来自《80x86汇编语言程序设计-王成耀 编》

大多数高级语言使用堆栈传递参数。例如Pascal编译器将参数以从左到右的顺序进栈,Pascal过程调用

PascalProc(i,j,k+4);

在编译后,通常会生成下列80x86代码(假定ijk均为整数,占两个字节,且采用值传递):

 

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);

其中,参数jk为值传递,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的地址,存入ESBX

mov ax,PasProc_j

;取参数j

add ax,PasProc_k

;参数jk相加

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

 

 

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