x86进/出端口I / O的C内联汇编具有操作数大小不匹配

时间:2018-09-16 14:46:54

标签: c gcc assembly x86 inline-assembly

我正在关注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'

我该如何解决?

1 个答案:

答案 0 :(得分:6)

端口号必须位于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;
}

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