In the cdecl
调用约定,它指出:
Arguments are pushed in the reverse order (right to left)
我的问题是:逆序相对于什么非逆序?与功能文档相关吗?例如,如果我有以下函数文档:
void __cdecl foo (int arg1, int arg2, int arg3)
那么我是否应该只查看函数文档中参数的顺序并反转推入堆栈的增强?
根据 asm 指令顺序和执行顺序,第一个函数参数被推到最后。然而,由于堆栈向下增长,第一个参数具有最低的地址。
此方案意味着第一个参数(和第二个等)始终可以作为当前堆栈指针的常量偏移量进行访问 - 它位于返回地址之后。
是的,您应该完全按照问题末尾的建议进行操作,尽管常见的技术是在函数头部的堆栈上保留空间,该空间足够大以支持所有堆栈变量以及任何所需的函数调用参数(但不是返回地址)并简单地进行堆栈相对存储来设置参数。
请注意,在许多 ISA ABI 中,前几个参数在寄存器中传递,而不是在堆栈上传递,但无论如何都会保留堆栈空间,以便跨嵌套函数调用进行可能的存储。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)