杨力祥老师在C++课后给同学留了一道思考题,即探讨C++函数调用时其内存的结构究竟是什么样的。在参考《程序员的自我修养》的过程中,对于书上的描述有些疑惑,因此自己在VS2008的环境下,对程序1进行了反汇编,并随着单步调试的进行察看了内存的变化,发现书上给出的图和描述存在一些小错误。在此将实际的过程记录下来。
//程序1
#include <iostream>
using namespacestd;
int foo(inti){
int a= 1, b= 2;
b = a;
return i;
}
int main(){
int a =foo(0xABCDEF);
return 0;
}
首先要说明的是,程序运行时的实现是根据编译器的不同而不同的,因此需要强调,本文中讨论的所有过程都是在VS2008的编译环境下进行的,且考察的是debug版本的反汇编。
图1 运行时的栈结构
图1 是函数调用时栈的结构,下面来具体说一说汇编指令每一步都做了什么。
要事先说明的是EBP指针和ESP指针,前者在一个函数的运行过程中(没有调用其他函数时)是一个固定值,它指向的位置如图1所示;后者是栈顶指针。
序 |
操作方 |
对应汇编 |
内存操作 |