c++ - 如果 C++ 使用 cdecl 调用约定,为什么 Godbolt 会显示在 edi 中传递的参数?
解决方案
RBP
并且RSP
是 64 位寄存器,这意味着您的代码正在编译为 64 位,而不是 32 位。 cdecl
是一个 32 位的调用约定,它在 64 位中根本不存在。在 64 位系统上,前几个整数大小的参数是通过寄存器而不是调用堆栈传递的。
在非 Windows 平台上(godbolt 在使用 Ubuntu 的 Amazon EC2 实例上运行),前 6 个整数大小的参数分别通过RDI
、RSI
、RDX
、RCX
、R8
和R9
寄存器传递。 EDI
是 的 0-3字节,在你的编译器RDI
中int
是 4 字节,所以你看到num
参数是通过EDI
.
在 Windows 平台上,前 4 个整数大小的参数分别通过RCX
、RDX
、R8
和R9
寄存器传递。EDI
不用于传递参数。
有关更多详细信息,请参阅x86-64 上的堆栈框架布局。
推荐阅读
- excel - 如何在列表框中显示多列?
- shopify - Shopify:在管理订单创建中添加验证
- javascript - 单击按钮后如何使输入字段为空?
- dynamic - 如何使用 CMake 混合链接静态库和共享库
- python - 如何在 bash 中写入和导出 python 文件?
- google-cloud-platform - 如何在 Google Cloud Scheduler 作业中设置内容类型
- linux - 使用 Jenkins 端到端多分支管道项目创建时出现 Git 凭证问题
- android - Android spinner 基于多表数据列比较加载内容
- java - 虽然循环程序无法正常运行
- amazon-web-services - AWS Boto3 方法“update_auto_scaling_group()”间歇性静默失败