冗余组装说明?

Jar*_*sen 4 x86 assembly gcc reverse-engineering

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

movq    %rax,0xf8(%rbp)
movq    0xf8(%rbp),%rax
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ley 9

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

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

  • 通过使用**volatile**说明符声明局部变量,即使在最佳设置下也应该很容易生成汇编列表.这不是你应该在现实代码中找到的东西,尽管...... (4认同)
  • 虽然在这种情况下这可能是正确的答案,但必须注意,redundent op也用于重新对齐代码地址以帮助处理管道,这在"密集"循环之前很常见. (2认同)
  • 这种情况非常罕见(而不是您的情况),但在处理内存映射设备时可能需要这样的序列. (2认同)