2

バイナリファイルで特定の命令を検索していますが、そのxor eax,eax命令には次のような関数があります。

int foo(){
  return 0;
}

GCC 4.7.2 および -O2 または -O3 最適化フラグを使用してコンパイルすると、アセンブリの結果は良好foo()です。

xor eax,eax

関数を終了する前に。代わりに、-O1 または最適化なしでコンパイルした場合、従来の

mov eax,0x0

は生産された。

問題は、(C コードに関して、および __asm ディレクティブなしで) を生成する他の方法があるかどうかです。

xor eax,eax

GCC と -O1 を使用するか、最適化が設定されていない命令ですか?

4

3 に答える 3

4

insnxor %eax, %eaxは、ピープホールの最適化中に生成されます。大まかに言えば、ピープホール最適化パスは、ターゲット CPU でより優れたパフォーマンスを発揮することが知られている一般的なパターン/イディオムを探してコードを調べます。

質問に答えるには、 を使用してのぞき穴の最適化を有効にする必要があります-fpeephole2

PS。-fpeephole2によって有効にされていますが、によって-O2ではありません-O1

于 2012-11-15T17:01:31.833 に答える
0

命令を取得するにxorは、xor 演算子を使用できます。

register int i = 1;
i = i ^ i;

ただし、そのi用途eaxがより不確実になる可能性があることを確認してください。

于 2012-11-15T16:15:33.437 に答える
0

または優れた最適化を使用せずに (およびバイナリ操作自体を使用せずに) xor eax,eax、GCC でレジスタを使用してを生成することは非常に困難です。-O2

xor eax,eaxは と同等だからですmov eax,0が、何らかの理由で、GCC は最適化に xor メソッドを使用します (どちらが速いかはわかりません)。したがって、最適化を行わずにこのようなアセンブリ コードを生成したい場合は、C/C++ で実際の xor 演算子を使用する場合を除いて ( ^)、おそらくそれほど簡単には取得できません。

以上を使用する-O2と、この種の指示を簡単に取得できます。たとえば、次のようになります。

#include <stdio.h>

int main(void)
{
    int a = 0;
    printf("%d", a);
    return 0;
}

でコンパイルされた場合、これは任意のレジスタであるxor r1,r12つを生成します。最初の xor 命令はの初期化にあります。2 番目の値は 0 であるため、.r1-O2areturnxor eax,eax

私の例をテストするには、GCC Explorer-O2オプションとともに使用できます。

于 2012-11-15T16:27:46.263 に答える