cdecl 调用约定中,它指出:

Arguments are pushed in the reverse order (right to left)

我的问题是:以相反的顺序相对于什么非相反的顺序?它与功能文档有关吗?例如,如果我有以下功能文档:
void __cdecl foo (int arg1, int arg2, int arg3)

那么我应该只查看函数文档中参数的顺序并反转推送到堆栈上的增强吗?

最佳答案

根据 asm 指令顺序和执行顺序,最后推送第一个函数参数。然而,由于堆栈向下增长,第一个参数具有最低地址。

这个方案意味着第一个参数(和第二个等)总是可以作为当前堆栈指针的常量偏移量访问 - 它位于返回地址之后。

是的,您应该完全按照您在问题末尾的建议进行操作,尽管一种常见的技术是在函数开头的堆栈上保留空间,该空间足够大以支持所有堆栈变量以及任何必需的函数调用参数(但不是返回地址)并简单地执行堆栈相关存储来设置参数。

请注意,在许多 ISA ABI 中,前几个参数在寄存器中传递,而不是在堆栈中传递,但无论如何都会保留堆栈空间,以便在嵌套函数调用之间进行可能的存储。

关于assembly - 他们说 "Arguments are pushed in the reverse order"是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27979376/

10-11 19:02