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
    设置为0


  • 1) 没有区别。这是那些创建x86 AT&T语法以支持端口号寄存器周围的括号的人的决定。可能是因为IO空间中的端口本质上类似于内存地址(但不是内存地址)。有人可能认为对IO空间和内存的访问应该允许一致使用括号。我个人认为这会让维护代码库的新手感到困惑,因为他们可能不得不考虑。2)在执行程序集模板之前,EBX将设置为0。完成后,EBX中的值将被传输到变量
    ebxReg
    ,您不会显示所有代码,因此我假设您的模板实际上修改了EBX寄存器,但您不会显示该代码。我建议不要在组装中做超出需要的事情。编写一个函数,使用内联汇编获取端口的32位值,但在C中执行其他工作。仅在需要时使用内联汇编,并尽量用C编写。有关括号的注释适用于
    inl
    inb
    inw
    。它不特定于
    inl