冗余组装说明?

时间:2011-02-22 05:39:16

标签: gcc assembly x86 reverse-engineering

最近我一直在努力学习逆向工程。因此,我一直在研究很多汇编代码。我对以下内容感到困惑:

movq    %rax,0xf8(%rbp)
movq    0xf8(%rbp),%rax

我已经好几次见过这个了。这不是多余的吗?为什么编译器会这样做?我正在看的二进制文件是用gcc编译的。

1 个答案:

答案 0 :(得分:9)

您可能在没有优化的情况下编译(-O)。您所看到的是中间表示的直接,天真的翻译。这样的片段通常是由于值存储在局部变量中,在本例中为 0xf8(%rbp)。然后立即使用该值,因此将其再次加载到寄存器%rax 中。优化器将发现从%rax存储仅恢复到同一个寄存器是多余的并完全删除序列。如果所有优化阶段都失败,至少一个窥视孔会发现这两个指令是连续的。

如果您确实打开了优化,那么这确实很奇怪,但如果发布更大(但不是过大)的序列,可能会解释。还有很多案例会产生明显不太理想的东西,但没有那么明显。