Debugging 内联组件从IO端口读取字和双字
在以下代码中的inw命令之后,我有一个分段错误: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));
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声明为无符号字符-它没有分段错误-但我需要inw和inl进行另一个测试
我的代码中有什么问题
通常,我会尝试在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读取内存,我会考虑添加“内存”。