如果C使用cdecl调用约定,为什么godbolt (gcc 9.3)显示参数在edi中被传递?我在这上面找不到任何东西
RBP
和 RSP
是 64 位寄存器,这意味着您的代码是针对 64 位而不是 32 位编译的。cdecl
是一个 32 位调用约定,它在 64 位中根本不存在。在 64 位系统上,前几个整数大小的参数通过寄存器传递,而不是通过调用堆栈传递。
在非Windows平台上(godbolt在使用Ubuntu的Amazon EC2实例上运行),前6个整数大小的参数分别通过RDI
、RSI
、RDX
和RCX、
R8
以及R9
寄存器传递EDI
是RDI
,而int
在编译器中是4个字节,因此您可以看到num
参数通过EDI
传递。
在Windows平台上,前4个整数大小的参数分别通过
RCX
、RDX
、R8
和R9
寄存器传递。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,我仍然会得到与以前相同的错误,我的其余页面会中断。 浏览器中的