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

标签 c++ godbolt

enter image description here

如果 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 个整数大小的参数通过 RDIRSIRDXRCXR8R9 寄存器。 EDIRDI 的字节 0-3,而 int 在你的编译器中是 4 个字节,所以你会看到 num 参数通过 EDI 传递。

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

参见 Stack frame layout on x86-64 了解更多详情。

关于c++ - 如果 C++ 使用 cdecl 调用约定,为什么 godbolt 显示在 edi 中传递的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60961947/

相关文章:

c++ - std::condition_variable 中可能的竞争条件?

c++ - C++ 中的递归与迭代阶乘

c++ - 使用 Godbolt 进入标准库调用

c++ - Godbolt 不显示标准输出

c++ - 将字符串解析为 int 的 vector

c++ - 动态确定构建/触发事件的所有解决方案、项目和配置,并使用 MSBuild 从命令行/脚本调用它们

c++ - C++ 中的类型检查