如果 C++ 使用 cdecl 调用约定,为什么 Godbolt (gcc 9.3) 显示在 edi 中传递的参数?我在这上面找不到任何东西
user7318497
问问题
125 次
1 回答
8
RBP
并且RSP
是 64 位寄存器,这意味着您的代码正在编译为 64 位,而不是 32 位。 cdecl
是一个 32 位的调用约定,它在 64 位中根本不存在。在 64 位系统上,前几个整数大小的参数是通过寄存器而不是调用堆栈传递的。
在非 Windows 平台上(godbolt 在使用 Ubuntu 的 Amazon EC2 实例上运行),前 6 个整数大小的参数分别通过RDI
、RSI
、RDX
、RCX
、R8
和R9
寄存器传递。 EDI
是 的 0-3字节,在你的编译器RDI
中int
是 4 字节,所以你看到num
参数是通过EDI
.
在 Windows 平台上,前 4 个整数大小的参数分别通过RCX
、RDX
、R8
和R9
寄存器传递。EDI
不用于传递参数。
有关更多详细信息,请参阅x86-64 上的堆栈框架布局。
于 2020-04-01T00:52:33.543 回答