通过%esp进行汇编堆栈管理

时间:2014-10-05 17:12:19

标签: c gcc assembly

我真的不明白为什么gcc在调用函数之前会减去12到esp。

    pushl   %ebp
    movl    %esp,%ebp
    sub $12,%esp

    socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    movl    $AF_INET,(%esp)

2 个答案:

答案 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

我发现此资源非常有用