c - 为什么GCC首先将整数加载到eax,然后再加载到其他一些相关寄存器?
问题描述
使用这个站点,我为一个简单的程序生成了汇编代码。
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], 5
mov eax, DWORD PTR [rbp-4]
mov edi, eax
mov eax, 0
call ifunc
mov eax, 0
leave
ret
这里 a 的值从内存加载到 eax 中,然后它被移动到 edi 以传递给函数。但是我写了一个类似的汇编代码并直接将a的值加载到edi中。两者都工作正常。GCC 是否遵循此进行某种优化?先加载eax有什么好处?
解决方案
GCC 是否遵循此进行某种优化?
恰好相反。您在没有优化的情况下进行编译,因此 gcc不会进行会删除冗余s 和作为堆栈内存中变量mov
的不必要分配的优化。a
先加载eax有什么好处?
它没有,只是多余的。未经优化的编译器代码包含像这样看起来很愚蠢的东西是很常见的。
推荐阅读
- azure-devops - 在 Azure DevOps 中,如何安排发布管道以按季度执行?
- python - 尝试在 Tensorflow 上使用 .h5 加载的分类模型进行预测,返回 IndexError: list index out of range
- firebase - Firestore 错误:[cloud_firestore/unknown] 无效参数(dartObject):无法转换:“_FieldValueServerTimestamp”实例
- mongodb - MongoDB - 无法调用 ClusterDescription.getConnectionMode(),因为 clusterDescription 为空
- reactjs - 解决纱线工作区中的 TypeScript 依赖项
- javascript - Javascript更改具有特定ID的所有跨度的颜色
- apache-spark - 为什么创建了 5 个分区和 10 个桶后,后端创建的数据文件数量如此之多?
- docker - 在 Docker Desktop 中启用 k8s 实验功能
- python - 如何在 Python 中检查新设备何时连接到 Wifi
- json - axios fetch(ReactJs)后未出现数据