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



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

    pushl   %ebp
    movl    %esp,%ebp
    sub $12,%esp
    socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    movl    $AF_INET,(%esp)

当前*x86 ABI要求堆栈指针在函数调用时对齐mod 16。这是对堆栈指针进行无法解释的调整的典型原因。

*我之所以说current,是因为GCC实际上单方面更改了ABI,并在3.x系列的某个地方引入了这一要求。我手头没有参考资料,但也许其他人可以提供。这一更改旨在优化SIMD指令的使用,但实际上并不需要,当旧代码调用回假定对齐的新代码时,最终破坏了ABI与旧代码的兼容性。整个故事一团糟。

首先,您正在推送基指针的值,该值会递减堆栈指针的值。由于推送操作实际上使sp向上移动,因此实质上使地址递减。然后,c程序的堆栈框架由代码seg组成,在代码seg之上有函数的参数。现在,当你想访问传递给函数的第一个参数时,你需要添加12个字节,因为最终需要弹出3个字12个字节才能获得该参数。

http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html

我发现这个资源对非常有用

最新更新