2

在此处输入图像描述

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

4

1 回答 1

8

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 上的堆栈框架布局。

于 2020-04-01T00:52:33.543 回答