пробую использовать inline asm в gcc, например есть такой макрос:
#define __syscall3a( name, a,b,c ) ({\
unsigned long ret;\
__asm__ __volatile__(\
"syscall" : "=a"(ret) :\
"a"(__NR_##name),"D"(a),"S"(b),"d"(c) :\
"memory","cc","r11","cx");\
(long int)ret; })
это системный вызов с тремя параметрами, по идее всё предусмотрено и выполняется корректно, но не всегда. иногда gcc/gas подбирает другие регистры для name,a,b или c, а нужны именно указанные в строке входных регистров... попробовал ещё такой вариант кода:
#define __syscall3b( name, a,b,c ) ({\
unsigned long ret;\
register long int _n __asm__("%rax") = (long int)(__NR_##name);\
register long int _a __asm__("%rdi") = (long int)(a);\
register long int _b __asm__("%rsi") = (long int)(b);\
register long int _c __asm__("%rdx") = (long int)(c);\
__asm__ __volatile__(\
"syscall" : "=a"(ret) :\
"r"(_n),"r"(_a),"r"(_b),"r"(_c) :\
"memory","cc","r11","cx");\
(long int)ret; })
тоже работает корректно, НО иногда при компиляции получаю ошибку: «error: can't find a register in class ‘AREG’ while reloading ‘asm’»
подскажите, если ли варианты улучшить ситуацию с инлайном в данных случаях, кроме отказа от него? может быть существуют какие-нибудь «хитрые» ключики компиляции?