11

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

GCC コンパイラに最適化がない場合、減算に命令を使用しますが、(正確には)subl最適化をオンにすると、コンパイラは減算の代わりに命令を使用します。以下の例を参照してください。-O3leal

最適化なし:

83 e8 01     subl $0x1, %eax 

最適化あり

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

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

どんな助けでも大歓迎です。

4

2 に答える 2

15

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

しかし、推測しなければならないのlealは、ソースレジスタを破壊することなく減算をアウトオブプレースで実行できるためです。

これにより、余分なレジスタの移動を節約できます。


最初の例:

83 e8 01     subl $0x1, %eax 

上書き%eaxして元の値を破棄します。

2番目の例:

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

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

于 2012-10-02T01:24:38.930 に答える
11

leaまた、フラグには影響しませんが、影響することにも注意してくださいsub。したがって、後続の命令が減算によって更新されるフラグに依存しない場合は、フラグを更新しない方が効率的です。

于 2012-10-02T04:12:27.820 に答える