【发布时间】:2014-01-31 13:15:16
【问题描述】:
我试图了解在函数调用期间堆栈上会出现什么。
据我所知,被调用者的参数(如果有的话)、调用者的返回地址和基地址将在调用另一个函数之前被压入堆栈。
所以,我写了一个简单的 C 程序
#include <stdio.h>
void
foo()
{
}
int
main()
{
foo();
return 0;
}
而对应的反汇编机器码是
08048334 <foo>:
8048334: 55 push %ebp
8048335: 89 e5 mov %esp,%ebp
8048337: c9 leave
8048338: c3 ret
08048339 <main>:
8048339: 55 push %ebp
804833a: 89 e5 mov %esp,%ebp
804833c: 83 ec 08 sub $0x8,%esp
804833f: 83 e4 f0 and $0xfffffff0,%esp
8048342: b8 00 00 00 00 mov $0x0,%eax
8048347: 83 c0 0f add $0xf,%eax
804834a: 83 c0 0f add $0xf,%eax
804834d: c1 e8 04 shr $0x4,%eax
8048350: c1 e0 04 shl $0x4,%eax
8048353: 29 c4 sub %eax,%esp
8048355: e8 da ff ff ff call 8048334 <foo>
804835a: b8 00 00 00 00 mov $0x0,%eax
804835f: c9 leave
8048360: c3 ret
8048361: 90 nop
8048362: 90 nop
8048363: 90 nop
虽然 foo() 的代码有意义,但我无法理解 main() 的代码。为什么会有这么多操作?我只期待 main() 中的以下操作
1. Push the frame pointer
2. Call foo (which will inturn save the return address)
谁能解释一下 main() 的代码?谢谢!
【问题讨论】:
标签: assembly stack function-call