1

ローカル レジスタ %l0 - %l7 を異なる値に設定する以外に何もしない、非常に単純なインライン アセンブリ ルーチンを C プログラムに記述したいと考えています。次の簡単なアプローチを試しました。

asm volatile (
    ".text\n\t"
    "mov 0, %%l0             \n\t"
    "mov 1, %%l1             \n\t"
    "mov 2, %%l2             \n\t"
    "mov 3, %%l3             \n\t"
    "mov 4, %%l4             \n\t"
    "mov 5, %%l5             \n\t"
    "mov 6, %%l6             \n\t"
    "mov 7, %%l7             \n\t"
);  

残念ながら、アセンブラは次のように伝えます。各命令のオペランドが不正です。どなたか、即値を SPARC アセンブラに適切に渡す方法を教えていただけないでしょうか?

本当にありがとう!

編集:クリスに感謝します。あなたが提案した変更を行いましたが、Sparc コンパイラはまだ不正なオペランドについて何かを伝えています...

4

2 に答える 2

2

SPARC は「即時移動」命令自体を作成しません。のorように使用できるものor %g0, 123, %l0(またはゼロ レジスタを使用して 11 ビット以下の定数を使用し%g0、その定数をターゲット レジスタに移動する)、または上位21sethiを設定するために使用できる命令のいずれかがあります。レジスタのビット。したがって、任意の(32 ビット) 定数に対応するには、最初に上位ビットを実行し、続いて下位ビットを実行することにより、2 つのステップを合成する必要があります。setsethior

SPARC アセンブラは、通常、set ..., %tgtregisterこのシーケンスを作成するためのショートカットを知っています。また、定数がそれに適合する場合は、1 つの命令を削除します。

また、64bit/sparcv9 では、set命令は最終的に 5 つまでの命令のシーケンスに評価され、物事を一緒にシフト/オアすることに注意してください。

于 2011-03-04T09:07:39.120 に答える
0

-- source、destination のような行が必要ですmov 0, %%l0。定数は単なる定数であり、「#」文字はありません。

編集

asm ディレクティブに制約がない場合 (単なる文字列)、gcc は % エスケープの文字列を処理しません。したがって、その場合%、レジスタ名の前に 1 文字だけが必要です。ただし、制約を追加する場合 (または文字列の直後-- 空の制約セット) は、% エスケープを検索するため、名前を登録::する必要があります。%%

::そのため、 の直前にを追加するか、文字)の重複を解除してください。%

于 2011-03-03T17:52:49.603 に答える