日期:2014-05-16  浏览次数:20835 次

从汇编角度来理解linux下多层函数调用堆栈运行状态


我们用下面的C代码来研究函数调用的过程。

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int bar(int c, int d)
{
    int e = c + d;
    return e;
}

int foo(int a, int b)
{
    return bar(a, b);
}

int main(void)
{
    foo(23);
    return 0;
}

如果在编译时加上-g选项,那么用objdump反汇编时可以把C代码和汇编代码穿插起来显示,这样C代码和汇编代码的对应关系看得更清楚。反汇编的结果很长,以下只列出我们关心的部分。

simba@ubuntu:~/Documents/code/asm$ objdump -aS a.out 

 ASM Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
int bar(int c, int d)

 80483dc:       55                      push   %ebp
 80483dd: