原本以为栈就那回事,存放一下临时变量,参与一下函数的调用,但是今天看《程序员的自我修养》又让我对栈加深了了解
我这里只想说下我不知道的,至于那些调用惯例我就不多说了,理解起来不是很难
除了参数的传递之外,函数与调用方的几哦啊胡还有一个渠道就是返回值,eax是传递返回值的同道,但是eax本身只有4字节,大于4字节的采用edx和eax做返回值,而对于超过8字节的返回类型参照下面的例子
1 typedef struct big_thing
2 {
3 char buf[128];
4 }big_thing;
5
6 big_thing return_test()
7 {
8 big_thing b;
9 b.buf[0]=0;
10 return b;
11 }
12
13 int main()
14 {
15 big_thing n=return_test();
16 return 0;
17 }
首先main函数在栈上额外开辟了一片空间,并将这块空间的一部分作为传递返回值的临时对象,这里称之为temp
将temp对象的地址作为隐含参数传递给return_test()
return_test()将数据拷贝给temp对象,并将temp对象的地址用eax传出
return_test()返回之后,main函数将eax指向的temp对象的内容拷贝给n
综上所述,上述过程拷贝了两次,如果是c++类的话,在这个过程中构造函数会执行两次。