我真的不明白为什么gcc在调用函数之前会减去12到esp。
pushl %ebp
movl %esp,%ebp
sub $12,%esp
socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
movl $AF_INET,(%esp)
答案 0 :(得分:1)
当前的 * x86 ABI要求堆栈指针在函数调用时与mod 16对齐。这是堆栈指针无法无法解释的典型原因。
*我说当前因为GCC实际上单方面改变了ABI并在3.x系列的某个地方引入了这个要求。我没有方便的参考,但也许其他人可以提供它们。此更改旨在优化SIMD指令的使用,但实际上并不需要用于此目的,并且当旧代码回调假定对齐的新代码时,最终破坏了ABI与旧代码的兼容性。整个故事一团糟。
答案 1 :(得分:0)
首先,您要推送基指针的值,这会减少堆栈指针的值。由于推送操作实际上使sp upwars基本上减少了地址。然后c程序的堆栈帧由代码段组成,在其上面有函数的参数,其上面是sp。现在当你想要访问传递给函数的第一个arg时,你需要添加12个字节,因为3个字最后需要弹出12个字节才能获得该参数。
http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html
我发现此资源非常有用