background image

关于 语言中函数调用和参数传递机制的探讨

  
函数,相信许多人也知道其重要性;一个文件往往由一个或者多个函数构成的。然而可能
许多人还不知道函数调用的一些深层问题,所以我写的这篇文章一来是应
了一个好朋友的要求而写,二来希望一些朋友能够从我这篇文章了解函数调用的机制。但
是并不是每个人都可以完全读懂这文章,想完全读懂此文,我想必须具备三个条件:

    一、对于 C 语言有一定的了解,最起码有一个整体的初步了解;

    二、能够读懂UNIX/LINUX 下的 AT&T 语法的汇编;AT&T 汇编与 Intel 汇编的差别还
是挺大的;这个条件可能一些人就不具备了,但是你通过阅读此文相信也能对函数调用
机制有一个大概的了解;

    三、看到这么长的文章,一定要有耐心,用心看相信应该多少有点帮助;

    好了,不讲废话了,进入主题吧。

一、基本知识框架了解:

    这部分主要讲一些基本的东西,主要是关于堆栈的知识。只有了解了堆栈的基础内容 ,
才可以继续往下读。

1.概念性的知识:

    所谓堆栈,其实也就是程序使用的一种内存元素;它是内存中用来存放一些数据的区
域。我曾经写过一篇文章发表在这个论坛上里面也谈到了堆和栈的区别;平常经常说的堆
栈,其实也是栈,而不是堆,所以这里也一样。注意这和数据结构说的栈其实还是有区别
的,不要混在一起。

2.堆栈的工作方式:
    
    平常我们所说的数据是怎么存放在内存的?是从低地址开始,然后按照数据占用字节
大小往高地址逐个存放的。但堆栈就不一样了。堆栈的工作方式是数据插入堆栈区域然后
从堆栈区域删除数据。这是概括的说法。具体是这样的:
    
    在 UNIX/LINUX 中,堆栈是从高地址向低地址衍生的。这里得说一个重要的东东,那
就是堆栈指针 ESP。堆栈指针是什么?它永远指向堆栈中的顶部(但如果按照地址值来说
却是底部),是不是对顶部这个词的理解感觉有点模糊?就是说,比如说你压栈,就压
进一个 4 字节的数据元素,那么 ESP 就向下移动了 4 个字节,注意这里是向下移动,所
以 ESP 应该指向了更低的地址,所以说它是指向了底部。你可以把堆栈想象成一个杯子,
倒进水了水平线是不是上升了(这里把杯子最底端假设成高地址,把顶端设为低地址) ,
倒出水了水平线是不是下降了?就和压栈和进栈的道理一样的。如果还没有理解也没关系,
自己画个图仔细比较就可以了。这里让我偷懒一下就不画图了。