内联汇编语法错误
Inline assembler syntax error
我在开发操作系统时遇到了一些奇怪的错误。我正在使用 outb
和 inb
制作 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
我在开发操作系统时遇到了一些奇怪的错误。我正在使用 outb
和 inb
制作 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