несоответствие встроенной сборки g в скобках

#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.