Я думаю, вы хотели использовать инструкцию asm outb
вместо out
. outb
выводит байт в порт, где, как out
записывает 2 байт word.Consider меняющийся код на:
__asm__("outb %%al, %%dx" : : "a" (data), "d" (port));
Хотя вы определили функцию void port_byte_out(unsigned short port, unsigned char data)
со вторым параметром unsigned char data
вашего примера port_byte_out(0xB004, 0x0000 | 0x2000)
попытку передать 2 байта word (short int) как data
. port_byte_out
предлагает вам эту функцию для вывода байт. 0x0000 | 0x2000
будет усекаться, так как он больше, чем unsigned char
. Большинство компиляторов должны были предупредить об этом.
Может быть, вы имели в виду, чтобы иметь другую функцию:
void port_word_out(unsigned short port, unsigned short data) {
__asm__("out %%ax, %%dx" : : "a" (data), "d" (port));
}
Тогда вы могли бы назвать его как:
port_word_out(0xB004, 0x0000 | 0x2000)
Вы передаете 16 битное значение в функции ожидающей 8 битное значение. – Lundin