首页 > 解决方案 > 如果 C++ 使用 cdecl 调用约定,为什么 Godbolt 会显示在 edi 中传递的参数?

问题描述

在此处输入图像描述

如果 C++ 使用 cdecl 调用约定,为什么 Godbolt (gcc 9.3) 显示在 edi 中传递的参数?我在这上面找不到任何东西

标签: c++godbolt

解决方案


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

在非 Windows 平台上(godbolt 在使用 Ubuntu 的 Amazon EC2 实例上运行),前 6 个整数大小的参数分别通过RDIRSIRDXRCXR8R9寄存器传递。 EDI是 的 0-3字节,在你的编译器RDIint是 4 字节,所以你看到num参数是通过EDI.

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

有关更多详细信息,请参阅x86-64 上的堆栈框架布局。


推荐阅读