3

Apple の llvm-gcc を使用して、インライン アセンブリでコードをコンパイルしています。やりたいことを書きましたが、変数をメモリに書き込み続ける無関係なコマンドが追加されます。なぜこれを行っているのですか?どうすれば停止できますか?

例:

__asm__{
  mov r11, [rax]
  and r11, 0xff
  cmp r11, '\0'
}

になります (「アセンブリ」アシスタント ビューで):

mov  0(%rax), %r11     // correct
movq %r11, -104(%rbp)  // no, GCC, obviously wrong
and  $255, %r11
movq %r11, -104(%rbp)
cmp  $0, %r11

乾杯。

4

3 に答える 3

2

GCC の拡張 asm 構文を使用して、どのレジスタを入力および出力として使用しているか、どのレジスタが破壊されるかを伝える必要があります。そうしないと、何をしているのかわからなくなり、生成されたアセンブリがコードを簡単に妨害する可能性があります。

コードが何をしているかを通知することで、割り当てと最適化を登録する方法を変更し、コードの破損を回避します。

于 2012-05-18T18:16:09.393 に答える
0

これは、gcc がコードを最適化しようとするためです。-O0コマンドラインに追加することで最適化を防ぐことができます。

于 2012-05-17T12:17:11.457 に答える
0

それが望ましくない場合は、 __asm__ の後に volatile を追加してみてください。その追加コマンドは、おそらく前/次の C 命令の一部です。揮発性コンパイラがなければ、これを行うことができます(おそらく、この方法でより速く実行されるためです-コードではなく、ルーチン全体)。

于 2012-05-17T18:14:29.570 に答える