当前位置: 首页 > 知识库问答 >
问题:

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

丌官运珧
2023-03-14

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

共有1个答案

上官扬
2023-03-14

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

在非Windows平台上(godbolt在使用Ubuntu的Amazon EC2实例上运行),前6个整数大小的参数分别通过RDIRSIRDXRCX、R8以及R9寄存器传递EDIRDI,而int在编译器中是4个字节,因此您可以看到num参数通过EDI传递。

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

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

 类似资料:
  • x86 正如所料,前4个参数通过x64中的寄存器传递。 其余参数按与x86中相同的顺序放在堆栈中。 与x86相反,在x64中我们不使用指令。相反,我们在的开头保留足够的堆栈空间,并使用指令将参数添加到堆栈中。 在x64中,在之后,不会进行堆栈清理,而是在的末尾。 这就引出了我的问题:

  • 我想在SysV ABI x86_64汇编中编写程序,到目前为止,我在寄存器中随机传递了参数。 但我刚刚在这个论坛上看到,这有一个标准。我们必须传递RDI、RSI、RDX和RCX(精确顺序为整数)。 现在我问自己两个问题。 首先,ESI和EDI不应该只在字符串操作期间使用吗?如果我想将整数作为参数而不是字符串传递,会发生什么? 其次,如果我需要传递一个32位参数而不是一个64位参数,该怎么办?例如,

  • 编辑:由于代码剪贴不会重现错误-这里有一个指向github repo的链接:(代码远未完成) https://github.com/altruios/clicker-game 我现在已经在两台计算机上运行了它——这两台计算机都有相同的行为,而代码剪报并没有显示出来。 因此,我正在构建一个clicker游戏来学习react,我不明白为什么这段代码会以这种方式运行: 在主应用程序中,我有以下功能: 那

  • 问题内容: 我在网上找到了这段代码,其中有一部分我不理解。对于doInBackground方法,传递的参数为。有人可以告诉我这是什么意思吗?那是什么 问题答案: doInBackground(String… params) // params represents a vararg. new AsyncHttpPost().execute(s1,s2,s3); // pass strings to

  • 我读在初始渲染时只被调用一次,但我看到它被渲染了多次。 似乎我创建了一个递归循环。 组件didMount调度动作来获取数据 一旦接收到数据,它就会触发成功操作,将数据存储在redux状态。 父反应组件连接到redux存储,并且具有mapStateToProps用于刚刚在上述步骤中更改的条目 父渲染子组件(通过变量编程选择) 子组件的组件didMount再次被调用 它消除了获取数据的操作 我想这就是

  • 样板 正常工作,但不包括。它给了我一个错误,说: 无法读取未定义的属性包含 剧本 这就是我的axios api调用的样子 混血儿 当我在created()钩子中控制台log responseData时,我得到一个空代理。 当我将它登录到挂载的钩子中时,我会得到一个具有正确数据的代理对象,但是如果我尝试从挂载的钩子调用API mixin,我仍然会得到与以前相同的错误,我的其余页面会中断。 浏览器中的