Я пытаюсь позволить встроенному ассемблеру копировать некоторые значения в определенные регистры, но он только жалуется. Это короткая версия кода, которая вызовет ошибку:
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
каждый раз, когда я использую макрос в разных функциях.