x86 输入/输出端口 I/O 的 C 内联 asm 具有操作数大小不匹配

C inline asm for x86 in / out port I/O has operand-size mismatch

我正在关注 youtube 上的一个教程,他说需要用 C 编写一些 asm 代码(我的汇编不是很好)所以我就应付了整个代码:

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'

我该如何解决?

端口号需要在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;
}

这应该可以解决您的问题。