質問

私はいくつかのCプログラムを逆アセンブルすることによって生成されたいくつかのアセンブリを見ていますが、私は頻繁に繰り返される単一の最適化に混乱しています。

GCCコンパイラに最適化がない場合は、次のものを使用します subl 減算のための命令が、私は最適化がオンになっているとき(-O3 正確には)コンパイラはaを使用します leal 減算の代わりに命令、以下の例:

最適化なし:

83 e8 01     subl $0x1, %eax 

最適化を使用して

8d 6f ff     leal -0x1(%edi), %ebp 

これらの命令は両方とも3バイトの長さなので、ここでは最適化が見られません。誰かが私を助けて、コンパイラの選択を説明しようとすることができますか?

任意の助けがいただければ幸いです。

役に立ちましたか?

解決

これを生成する元のCコードを見ずに伝えるのは難しいです。

しかし、私が推測しなければならなかった場合、それは理由です leal ソース-レジスタを破壊することなく、減算をout-of-placeにすることができます。

これは余分記録移動を救うことができる。


最初の例:

83 e8 01     subl $0x1, %eax 

オーバーライト %eax これにより、元の値が破棄されます。

第二の例 :

8d 6f ff     leal -0x1(%edi), %ebp 

店舗 %edi - 1%ebp. %edi 将来の使用のために保存されます。

他のヒント

また、それを覚えておいてください lea フラグには影響しませんが、 sub そうだしたがって、その後の命令が減算によって更新されるフラグに依存しない場合は、次のようになります ない フラグの更新もより効率的になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top