Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 冗余装配指令?_Gcc_Assembly_X86_Reverse Engineering - Fatal编程技术网

Gcc 冗余装配指令?

Gcc 冗余装配指令?,gcc,assembly,x86,reverse-engineering,Gcc,Assembly,X86,Reverse Engineering,最近我一直在努力学习逆向工程。因此,我一直在钻研大量的汇编代码。我对以下几点感到困惑: movq %rax,0xf8(%rbp) movq 0xf8(%rbp),%rax 我已经看过好几次了。这不是多余的吗?编译器为什么这样做?我看到的二进制文件是用gcc编译的。您可能在编译时没有进行优化(-O)。你看到的是对中间表示的直接、天真的翻译。像这样的代码段通常是由于存储在局部变量中的值,在本例中为0xf8(%rbp)。然后立即使用该值,以便再次将其加载到寄存器%rax中。优化器将发现从

最近我一直在努力学习逆向工程。因此,我一直在钻研大量的汇编代码。我对以下几点感到困惑:

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

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

您可能在编译时没有进行优化(-O)。你看到的是对中间表示的直接、天真的翻译。像这样的代码段通常是由于存储在局部变量中的值,在本例中为0xf8(%rbp)。然后立即使用该值,以便再次将其加载到寄存器%rax中。优化器将发现从%rax存储数据只是为了还原回同一个寄存器是多余的,并将整个序列删除。如果所有优化阶段都失败了,至少一个窥视孔会发现这两条指令是连续的


如果您确实启用了优化,那么这确实很奇怪,但如果您发布了一个更大(但不是过大)的序列,这可能会得到解释。仍然有很多情况下会生成明显次优的内容,但没有比这更明显的内容。

即使在最佳设置下,只要使用volatile说明符声明局部变量,也应该很容易生成程序集列表。这不是你应该在现实生活中的代码中找到的东西,虽然在这种情况下,这可能是正确的答案,但必须注意的是,redundent op还用于重新调整代码地址以帮助处理管道,这在“密集”循环之前非常常见。这是非常罕见的(不是你的原因),但是在处理内存映射设备时可能需要这样一个序列。@iManBiglari:
NOP
只是一个字节,inst获取和解码一条指令的速度更快,而不是一次解码一个字节(AMD有一个列表,其中列出了最好的情况,没有操作指令可以使用2到15个字节的长度).