Debugging 内联组件从IO端口读取字和双字

Debugging 内联组件从IO端口读取字和双字,debugging,assembly,x86,inline-assembly,kvm,Debugging,Assembly,X86,Inline Assembly,Kvm,在以下代码中的inw命令之后,我有一个分段错误: n=0; unsigned short port_in = 0; set_dr7(0x60000480); asm volatile("movw %0, %%dx \n\t" "outsw \n\t" : : "i"((short)(TESTDEV_IO_PORT + 3)), "S"(st1));

在以下代码中的inw命令之后,我有一个分段错误:

    n=0;
    unsigned short port_in = 0;

    set_dr7(0x60000480);
    asm volatile("movw %0, %%dx \n\t"
                 "outsw \n\t"
                 : : "i"((short)(TESTDEV_IO_PORT + 3)), 
                 "S"(st1));          
    asm volatile("inw %1, %0\n\t" : "=a"(port_in) : "i"((short)(TESTDEV_IO_PORT+3)));
我试了很多次了。。。但我仍然有一个分割错误。 当我尝试inb时,端口_in声明为无符号字符-它没有分段错误-但我需要inwinl进行另一个测试

我的代码中有什么问题


通常,我会尝试在kvm单元测试中添加一个测试。

假设您在Windows或Linux中执行此操作,并且您是作为应用程序运行的,那么您可能没有权限执行端口I/O,比如
in
inw
inl
。这些是特权指令,您不能在用户模式下使用。@Lower不完全正确,如果您有特权(
root
CAP\u SYS\u RAWIO
),并且您使用
iopl
ioperm
@Jester right,您可以在linux用户模式下使用它们,谢谢。我忽略了这个例子。假设你在内核中运行这个,你也在outsw中更改dx,而不让编译器知道。要么将其添加为一个clobber,要么(更好地)将您的输入从“i”更改为“d”,并去掉“movw”。由于Outsw读取内存,我会考虑添加“内存”。