インラインアセンブラにいくつかの値を特定のレジスタにコピーさせようとしていますが、文句を言うだけです。これは、エラーをトリガーするコードの短いバージョンです。
asm("" :: "r0" (value));
asm("" :: "a1" (value));
両方の行がトリガーされます:
Error: matching constraint references invalid operand number
では、直接取得するレジスタを指定するにはどうすればよいですか?値の名前を導入して自分でコピーできることはわかっていますが、このコードは短くて読みやすいため、これは避けたいと思います。
なぜ私が尋ねているのか 現在、私はいくつかのシステムコールに取り組んでいます。次のようなシステムコールマクロを使用したい:
#define SYSCALL0(NUMBER) asm("swi #" STRINGIFY(NUMBER));
#define SYSCALL1(NUMBER, A) asm("swi #" STRINGIFY(NUMBER) :: "r0"(A));
#define SYSCALL2(NUMBER, A, B) asm("swi #" STRINGIFY(NUMBER) :: "r0"(A), "r1"(B));
...
ご覧のとおり、これはオンラインにうまく収まります。もちろん、私は次のようなことをすることができます:
#define SYSCALL1(NUMBER, A) register type R0 asm("r0") = A;
SYSCALL0(NUMBER)
しかし、その後、型エラーが発生しないように、またはさまざまな関数でマクロを使用するたびに正しく与えるために、に変換A
する必要があります。type
type