#c #assembly #x86 #g #inline-assembly
#c #сборка #x86 #g #встроенная сборка
Вопрос:
g жалуется мне на отсутствие скобки в следующем коде:
1 2 3
v v v
__asm__ volatile("inb %1, %0" : : "=a" (result) : "Nd" (portnumber) );
^ ^ ^
1 2 3
как вы можете видеть, что скобки совпадают, и есть три открытые скобки и три закрытые скобки.
также для получения дополнительной информации я следую руководству YouTube
Комментарии:
1. Выходные операнды (
"=a"(result)
) должны быть между первыми 2 двоеточиями, а входные операнды ("Nd"(portnumber)
) должны быть после второго двоеточия. Попробуйте__asm__ volatile("inb %1, %0" : "=a" (result) : "Nd" (portnumber) );
2. Мне было бы любопытно, какое это было видео на Youtube?
Ответ №1:
У вас есть дополнительное :
значение перед выводом, поэтому вы получили свое объявление вывода во входной части. И причина этой ошибки: объявление вашего входного операнда, где компилятор ожидает список ошибок.Список clobber может включать только строковые литералы (имена регистров и "memory"
и / или "cc"
1), но не ()
.
__asm__ volatile("inb %1, %0"
: "=a" (result) // output
: "Nd" (portnumber) // input
// : "memory" // optional, clobber list
);
Возможно "memory"
, вам понадобится список ошибок, чтобы убедиться, что это упорядочено по адресу. доступ к памяти. Или нет, если вы уверены, что это не обязательно.
Сноска 1: операторы asm на x86 неявно искажают коды условий, "cc"
. Вы можете использовать это для документации, если хотите. Но вам это здесь не нужно, потому inb
что не касается EFLAGS.