Встроенный ассемблер C для ввода-вывода порта x86 имеет несоответствие размера операнда - PullRequest
0 голосов
/ 16 сентября 2018

Я следую учебному пособию по YouTube, и он сказал, что необходимо написать некоторый asm-код на C (я не очень хорош в сборке), поэтому я просто скопировал весь код:

unsigned char inPortB (unsigned int _port) {
    unsigned char rv;
    __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port));
    return rv;
}

и

void outPortB (unsigned int _port, unsigned char _data) {
    __asm__ __volatile__ ("outb %1, %0" : :  "dN" (_port), "a" (_data));
}

но когда я компилирую, я получаю эту ошибку:

operand type mismatch for 'in'
operand type mismatch for 'out'

как я могу это исправить?

1 Ответ

0 голосов
/ 16 сентября 2018

Номер порта должен быть в dx, что является 16-битным регистром. Чтобы заставить gcc сгенерировать ссылку на dx вместо edx, как это происходит с вашим кодом, вам нужно присвоить _port 16-битный тип, например, unsigned short

unsigned char inPortB (unsigned short _port) {
    unsigned char rv;
    __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port));
    return rv;
}

Это должно исправить ваши проблемы.

...