我正在尝试在我的内核开发研究中使用ACPI。当执行port_byte_out(0xB004, 0x0000 | 0x2000)
代码时,bochs给出'写入端口0xb004且忽略len 1'错误。 C函数如下:
void port_byte_out(unsigned short port, unsigned char data) {
__asm__("out %%al, %%dx" : : "a" (data), "d" (port));
}
该错误意味着什么?
答案 0 :(得分:1)
我认为您打算使用asm指令outb
而不是out
。 outb
向端口输出一个字节,其中out
写入一个2字节的字。考虑将代码更改为:
__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字节字(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)