По умолчанию GCC использует синтаксис сборки AT & T при генерации кода сборки из кода C .Это можно изменить, используя опцию компиляции -masm=intel
GCC .В обновлении вашего вопроса у вас есть -masm=intel
в командной строке GCC :
cc -m64 -masm=intel -c main.c
Код, который вы нашли, был разработан для синтаксиса AT & T, где операнд-источник команды является первыми пункт назначения второй.Опция -masm=intel
изменила это поведение.У вас есть два варианта.Поменяйте местами операнды в встроенной сборке, чтобы они были местом назначения, источником (синтаксисом Intel), например:
unsigned char inportb (unsigned short _port)
{
unsigned char rv;
__asm__ __volatile__ ("inb %0, %1" : "=a" (rv) : "dN" (_port));
return rv;
}
void outportb (unsigned short _port, unsigned char _data)
{
__asm__ __volatile__ ("outb %0, %1" : : "dN" (_port), "a" (_data));
}
Другой вариант - удалить опцию -masm=intel
из командной строки GCC и сохранить код как есть.,Это может быть предпочтительным, так как значительный объем кода разработки ОС использует синтаксис AT & T для встроенной сборки.
Примечание. Возможно, вы захотите использовать gcc
вместо просто cc