3

c での ASM の使用についてちょっとした質問があります。命令を実行したい:

LDR PC,=0x123456

これにより、「オペランドに予期しないトークンがあります」というエラーが表示されます。

asm("LDR PC,=0x123456");

これにより、「無効な制約」が発生します。

asm("LDR PC," : "m" (0x123456));

これを行う正しい方法は何ですか?

4

3 に答える 3

2

あなたはこれを使用しています:

asm("LDR PC,=0x123456");

これは標準の ARM アセンブリ命令ではなく、コンパイラ拡張機能として提供される疑似命令です。この疑似命令は、コンパイル時に他のアセンブリ命令に変換されます。clang はこのコンパイラ拡張機能をサポートしていないようです (このスレッドを参照してください)。アセンブリ命令への変換は自分で行う必要があります。LDR 疑似命令の変換方法については、ARM のドキュメントを参照してください。

于 2013-09-25T14:56:27.543 に答える
0

@Étienneに同意します。mi Googleツールチェーンでコードを試しました。それはうまくいっています。

コンパイラがディレクティブを命令 (通常は 2 つのmov命令)に変更する方法のマニュアルを読む必要があると思います。

于 2013-09-27T14:28:44.130 に答える
0

おそらく、プレーン C で必要な効果を達成できます。

((void (*)(void))0x123456)();

または、より詳細にしたい場合:

typedef void FN(void);
((FN*)0x123456)();
于 2013-09-26T11:37:01.757 に答える