3

私は次のアセンブリコードを持っています:

  __asm__ __volatile__ (
  "1: subi %0, 1"        "\n\t"
  "brne 1b"
  : "=d" (__count)
  : "M" (__count));

これにより、次のコンパイラ出力が生成されます

  ce:   81 50           subi    r24, 0x01   ; 1
  d0:   f1 f7           brne    .-4         ; 0xce <main>
  d2:   80 e0           ldi r24, 0x00   ; 0
  d4:   90 e0           ldi r25, 0x00   ; 0

どうすれば次のことを達成できますか?

  ce:   81 50           subi    r16, 0x01   ; 1
  d0:   f1 f7           brne    .-4         ; 0xce <main>
  d2:   80 e0           ldi r16, 0x00   ; 0

r24:r25の代わりにr16を使用するようにコンパイラーに指示することさえ可能ですか?そうすれば、ldir25,0x00行で使用されるサイクルカウントを1つ減らすことができます。

ありがとうジャック

4

2 に答える 2

4

この質問は古く、あなたは間違いなくすでにそれを解決していますが、アーカイブの目的で、私に答えさせてください:はい、できます。このように宣言します__count

register <type> __count __asm__ ("r16");

そしてvoilá!GNU拡張の明示的レジスター変数を使用して、C変数__countは、ASM呼び出しの外部を含め、使用される場所に関係なく常にr16に配置する必要があることを宣言しました。

この宣言にはローカルスコープが必要であることに注意してください。そうでない場合、コンパイラはこのレジスタを他の関数で使用しないようにします。

于 2012-07-17T13:04:22.407 に答える
0

これをチェックしてください:http ://www.nongnu.org/avr-libc/user-manual/inline_asm.html#io_ops

特定のレジスタを使用するように強制することはできないようです。ただし、"=a"代わりにを使用する場合"=d"は、レジスタr16..r23に制限します。これは、必要なものにする必要があります(「ペアの」レジスタr24 / r25を使用したくないため)。

于 2011-12-09T13:18:43.533 に答える