Gcc 美国电话电报公司;T语法:inl(%dx),%eax和inl%dx,%eax之间有什么区别吗?
我有以下代码:Gcc 美国电话电报公司;T语法:inl(%dx),%eax和inl%dx,%eax之间有什么区别吗?,gcc,x86,inline-assembly,att,Gcc,X86,Inline Assembly,Att,我有以下代码: __asm__ __volatile__ ("inl (%%dx), %%eax" : "=a" (result), "=b" (ebxReg) : ... "d" (IO_PORT), "b" (0) : "memory
__asm__ __volatile__ ("inl (%%dx), %%eax"
: "=a" (result), "=b" (ebxReg)
: ...
"d" (IO_PORT),
"b" (0)
: "memory");
inl%%dx
和inl(%%dx)
之间有什么区别?我的猜测是一样的(仅适用于inl
指令),但我想确定一下inl
指令之前,是否将ebx
设置为01) 没有区别。这是那些创建x86 AT&T语法以支持端口号寄存器周围的括号的人的决定。可能是因为IO空间中的端口本质上类似于内存地址(但不是内存地址)。有人可能认为对IO空间和内存的访问应该允许一致使用括号。我个人认为这会让维护代码库的新手感到困惑,因为他们可能不得不考虑。2)在执行程序集模板之前,EBX将设置为0。完成后,EBX中的值将被传输到变量
ebxReg
,您不会显示所有代码,因此我假设您的模板实际上修改了EBX寄存器,但您不会显示该代码。我建议不要在组装中做超出需要的事情。编写一个函数,使用内联汇编获取端口的32位值,但在C中执行其他工作。仅在需要时使用内联汇编,并尽量用C编写。有关括号的注释适用于inl
inb
和inw
。它不特定于inl