内联汇编语法错误

时间:2016-02-09 08:52:53

标签: c visual-studio inline-assembly ports osdev

我在开发操作系统时遇到了一些奇怪的错误。我正在使用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:'opcode'中的内联汇编语法错误;找到'('

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

1 个答案:

答案 0 :(得分:3)

Visual Studio的VC ++不支持 GCC 中提供的GNU汇编程序模板。由于您将virtual std::unique_ptr<Base> duplicate() const =0; 定义为16位无符号整数,因此需要使用带有16位端口号的OUT形式。您需要将16位端口号放在 DX 中。您还必须将内联汇编中的变量名称视为指针,因为您正在为函数使用标准的 CDECL 调用约定。示例代码:

struct DerivedTemplate : Base, EnableDuplication<DerivedTemplate, Base>
{
    DerivedTemplate(int value) : Base(value)
    {}

    virtual std::unique_ptr<Base> duplicate() const override
    {
        std::cout << "DerivedTemplate::duplicate()\n";
        return std::make_unique<DerivedTemplate>(*this);
    }
};

函数quantities[0] = {100, false}; quantities[1] = {150, true}; quantities[2] = {25, true}; quantities[3] = {30, false}; 可以通过以下方式完成:

http://myhost/check?{quantity=100&flag=false}&{quantity=150&flag=true}&{quantity=25&flag=true}&{quantity=30&flag=true}

这可以通过删除变量<DataTrigger Binding="{Binding RoleName}" Value="Payment Maker" > <Setter Property="IsEnabled" Value="True" /> </DataTrigger> 并将读取的字符存储到变量port然后执行static inline void outb(uint16_t port, uint8_t val) { __asm { mov dx, port mov al, val out dx, al } } 来简化。所以这也有效:

inb

有关使用VC ++内联汇编的更多信息,请参阅Microsoft Developer Network(MSDN)documentation