演算子「&」インライン GCC ARM アセンブリのアドレスを使用できますか? はいの場合、構造体 core_regx があり、その構造体のメンバー r0 のアドレスを以下のコードに渡す必要があります。
asm volatile("ldr r3, [%0,#0]":: "r" (&(core_reg->r0)));
このコードが正しいかどうかを確認してください。
はい、確かに&を使用できます。ただし、アセンブラー指定子にはいくつかの問題とより良いオプションがある可能性があることをお勧めします。
asm volatile("ldr r3, %0":: "m" (core_reg->r0) : "r3");
間違いなくr3を clobber リストに追加する必要があります。また、"m"
指定子の方がおそらく優れています。core_reg
がすでに にある場合r0
、コンパイラはr0
member のオフセットを使用して、次のようなコードを生成できます。
add r0, r0, #12 ; assuming r0 is core_reg.
ldr r3, [r0]
コンパイラは と の関係を認識していcore_reg
ますcore_reg->r0
。少なくとも"m"
、一部のバージョンのarm-xxx-gcc
. コンパイラが生成したコードを実行objdump --disassemble
して、意図したとおりに動作していることを確認します。
編集: GCC マニュアルには、 Gcc アセンブラーの制約、マシン固有、および一般情報など、多くの情報が含まれています。最高のARM アセンブラー クックブックなど、インターネット上には多くのチュートリアルがあります。