URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4237
[ Назад ]

Исходное сообщение
"about gcc inline assembly"

Отправлено Pavel , 06-Май-05 00:02 
есть такой код:
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" компилиться, а наоборт нет?
И зачем вообще надо указывать эти регистры?

Содержание

Сообщения в этом обсуждении
"about gcc inline assembly"
Отправлено const , 06-Май-05 07:28 
>И зачем вообще надо указывать эти регистры?

  В asm-блоке указываются:
1. блок инструкций
2. выходные регистры
3. входные регистры
4. изменяемые блоком инструкций (1) регистры, кроме выходных (2) (и так ясно, что они изменяются)
  В данном примере регистр edx вообще не изменяется _блоком инструкций_, а eax - выходной. Кстати, вместо %0, %1 лучше использовать настоящие имена: %%eax, %%edx.


"about gcc inline assembly"
Отправлено Павел , 06-Май-05 11:53 
А не могли бы вы привести пример кода с использование этой фишки.
Я воообще что то не припомню команды который модифицируют левые регистры.