我正在尝试让内联汇编将一些值复制到特定的寄存器中,但它只会报错。以下是触发错误的简短代码版本:
那么我如何直接指定寄存器呢? 我知道可以为值引入名称,然后自己复制它们,但我想避免这种情况,因为这会让代码更短,更易读。 我为什么要问 目前我正在处理一些系统调用。我想使用这样的系统调用宏:
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
。