首页 > 解决方案 > 为什么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有什么好处?

标签: cassemblygccx86

解决方案


GCC 是否遵循此进行某种优化?

恰好相反。您在没有优化的情况下进行编译,因此 gcc不会进行会删除冗余s 和作为堆栈内存中变量mov的不必要分配的优化。a

先加载eax有什么好处?

它没有,只是多余的。未经优化的编译器代码包含像这样看起来很愚蠢的东西是很常见的。


推荐阅读