есть такой код:
static inline unsigned char inb(unsigned short __port)
{
unsigned char data;
__asm__ __volatile__("inb %1,%0" :
"=a" (data) :
"d" (__port) :
"eax","edx"
);
return data;
}
так вот при компиляции получаю ошибку
fixed or forbidden register 0 (ax) was spilled for class AREG.
если закоментировать
: "eax","edx"
все нормально компилиться.
Наскоко я понимаю в последней части inline asm указываются регистры которые модифицируются асмовыми командами. В данном случае это вроде ax или al.
Вопрос в том почему без : "eax","edx" компилиться, а наоборт нет?
И зачем вообще надо указывать эти регистры?
>И зачем вообще надо указывать эти регистры?В asm-блоке указываются:
1. блок инструкций
2. выходные регистры
3. входные регистры
4. изменяемые блоком инструкций (1) регистры, кроме выходных (2) (и так ясно, что они изменяются)
В данном примере регистр edx вообще не изменяется _блоком инструкций_, а eax - выходной. Кстати, вместо %0, %1 лучше использовать настоящие имена: %%eax, %%edx.
А не могли бы вы привести пример кода с использование этой фишки.
Я воообще что то не припомню команды который модифицируют левые регистры.