如果 C++ 使用 cdecl 调用约定,为什么 godbolt 显示在 edi 中传递的参数?

Why does godbolt show parameter being passed in edi if C++ uses cdecl calling convention?

如果 C++ 使用 cdecl 调用约定,为什么 godbolt (gcc 9.3) 显示在 edi 中传递的参数?我找不到关于此的任何内容

RBPRSP 是 64 位寄存器,这意味着您的代码是针对 64 位而非 32 位编译的。 cdecl 是 32 位调用约定,它在 64 位中根本不存在。在 64 位系统上,前几个整数大小的参数通过寄存器传递,而不是调用堆栈。

在非 Windows 平台 (godbolt runs on Amazon EC2 instances using Ubuntu) 上,前 6 个整数大小的参数通过 RDIRSIRDX 传递, RCX, R8, 和 R9 分别注册。 EDIRDI 的字节 0-3,而 int 在你的编译器中是 4 个字节,所以你看到 num 参数是通过 EDI 传递的。

在 Windows 平台上,前 4 个整数大小的参数通过 RCXRDXR8R9 寄存器传递,分别。 EDI 不用于传递参数。

有关详细信息,请参阅 Stack frame layout on x86-64