我在开发操作系统时遇到了一些奇怪的错误。我正在使用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:'opcode'中的内联汇编语法错误;找到'('
有谁知道我为什么会收到这个错误?我该如何解决这个错误?有什么建议吗?
答案 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