2014-09-23 1 views
2

Я пытаюсь использовать ACPI в своем исследовании разработки ядра. Когда выполняется код port_byte_out(0xB004, 0x0000 | 0x2000), bochs дает «запись в порт 0xb004 с ошибкой len 1 ignored». Функция С состоит в следующем:bochs дает «запись в порт 0xb004 с len 1 ignored» error

void port_byte_out(unsigned short port, unsigned char data) { 
    __asm__("out %%al, %%dx" : : "a" (data), "d" (port)); 
} 

Что означает эта ошибка?

+0

Вы передаете 16 битное значение в функции ожидающей 8 битное значение. – Lundin

ответ

1

Я думаю, вы хотели использовать инструкцию 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)