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