最佳答案
RBP
和 RSP
是 64 位寄存器,这意味着您的代码是针对 64 位而非 32 位编译的。 cdecl
是 32 位调用约定,它在 64 位中根本不存在。在 64 位系统上,前几个整数大小的参数是通过寄存器而不是调用堆栈传递的。
在非 Windows 平台上 ( godbolt runs on Amazon EC2 instances using Ubuntu ),前 6 个整数大小的参数通过 RDI
、RSI
、RDX
、RCX
、R8
和 R9
寄存器。 EDI
是 RDI
的字节 0-3,而 int
在你的编译器中是 4 个字节,所以你会看到 num
参数通过 EDI
传递。
在 Windows 平台上,前 4 个整数大小的参数通过 RCX
、RDX
、R8
和 R9 传递
寄存器,分别。 EDI
不用于传递参数。
参见 Stack frame layout on x86-64 了解更多详情。
关于c++ - 如果 C++ 使用 cdecl 调用约定,为什么 godbolt 显示在 edi 中传递的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60961947/