内联汇编语法错误

Inline assembler syntax error

我在开发操作系统时遇到了一些奇怪的错误。我正在使用 outbinb 制作 IO 驱动程序。我的outb函数如下:

static inline void outb(uint16_t port, uint8_t val)
{
    __asm("outb %0, %w1"  //<--Error
        :
        : "a"(val), "Nd"(port));
}

我在 Visual Studio 中收到此错误:

C2400: inline assembler syntax error in 'opcode'; found '('

有谁知道我为什么会收到此错误?我该如何解决这个错误?有什么建议吗?

Visual Studio 的 VC++ 不支持 GCC 中可用的 GNU 汇编器模板。由于您将 port 定义为 16 位无符号整数,因此您需要使用采用 16 位端口号的 OUT 形式。您需要将 16 位端口号放在 DX 中。您还必须将内联汇编中的变量名视为指针,因为您使用标准的 CDECL 函数调用约定。示例代码:

static inline void outb(uint16_t port, uint8_t val) {
    __asm
    {
        mov dx, port
        mov al, val
        out dx, al
    } 
}

函数 inb 可以这样完成:

static inline uint8_t inb(uint16_t port)
{
    uint8_t data;
    __asm
    {
        mov dx, port
        in al, dx
        mov data, al
    }
    return data;
}

这可以通过删除变量 data 并将读取的字符存储到变量 port 中然后执行 return (uint8_t)port; 来简化。所以这也行得通:

static inline uint8_t inb(uint16_t port)
{
    __asm
    {
        mov dx, port
        in al, dx
        mov byte ptr[port], al   // Need to cast since port is 16-bit variable
    }
    return (uint8_t)port;
}

有关使用 VC++ 内联程序集的更多信息,请参见 Microsoft Developer Network (MSDN) documentation