【发布时间】:2015-11-15 17:14:37
【问题描述】:
我不太了解 gcc 的序言,尤其是对于 main。
为什么会有指令and esp, 0xfffffff0?我知道它的作用,但为什么有必要?
当我们调用一个函数时,我们首先要推送参数,但是为什么 gcc 不使用 push 指令而使用 movs 呢?此外,使用这些 mov,它会创建一个空填充。看起来很浪费内存,为什么呢?
最后,gcc 首先使用 sub 指令 esp 以便为堆栈“保留”内存,但是如何确保该内存不被其他程序使用?
我想我很好地理解了这个理论,但是我找不到一个文档来解释更多关于实践中的记忆(几个程序的记忆如何不重叠,......)。谢谢你的回答。
PS:我添加了汇编代码和cpp代码:
Dump of assembler code for function main(int, char**):
0x08048657 <+0>: push ebp
0x08048658 <+1>: mov ebp,esp
0x0804865a <+3>: and esp,0xfffffff0
0x0804865d <+6>: sub esp,0x20
0x08048660 <+9>: mov DWORD PTR [esp+0x1c],0x3
0x08048668 <+17>: mov BYTE PTR [esp+0x1b],0x61
=> 0x0804866d <+22>: mov DWORD PTR [esp],0x8048771
0x08048674 <+29>: call 0x804863c <p(char*)>
0x08048679 <+34>: mov eax,0x0
0x0804867e <+39>: leave
0x0804867f <+40>: ret
End of assembler dump.
int main(int argc, char *argv[]) {
int b = 3;
char c = 'a';
p("hello woooooooooorld !!");}
【问题讨论】:
-
gcc -O0甚至不使用xor eax, eax作为归零习语? ://