Я пытаюсь понять, что будет присутствовать в стеке во время вызова функции.
Насколько я понял, аргументы для вызываемого объекта (если есть), адрес возврата вызывающего объекта и базовый адрес будут помещены в стек перед вызовом другой функции.
Итак, я написал простую программу на 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()? Спасибо!