bochs给出了;写入端口0xb004,忽略len 1“;错误

bochs给出了;写入端口0xb004,忽略len 1“;错误,c,kernel,bochs,C,Kernel,Bochs,我试图在我的内核开发研究中使用ACPI。当执行端口字节输出(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)); } 这个错误是什么意思?我想你是想用asm指令outb而不是out

我试图在我的内核开发研究中使用ACPI。当执行
端口字节输出(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));
}

这个错误是什么意思?

我想你是想用asm指令
outb
而不是
out
<代码> OutBu/COD>将一个字节输出到一个端口,在这里,如<代码> Out/<代码>写入一个2字节的字。考虑将代码更改为:

__asm__("outb %%al, %%dx" : : "a" (data), "d" (port));
尽管您使用第二个参数
无符号字符数据定义了函数
void port_byte_out(无符号短端口,无符号字符数据)
,但您的示例
port_byte_out(0xB004,0x0000 | 0x2000)
尝试将一个2字节的字(短int)作为
数据传递
port\u byte\u out
表示您希望该函数输出一个字节
0x0000 | 0x2000
将被截断,因为它大于
无符号字符
。大多数编译器都应该对此发出警告

也许你想拥有另一个功能:

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位值的函数。