g ++内联汇编约束的意义(等于vs plus等)

时间:2012-06-12 18:08:53

标签: gcc x86 inline-assembly

我一直在gcc / x86下使用这个小函数来快速进行int16_t的字节交换:

static inline int16_t MySwapInt16t(int16_t val)
{
   __asm__ ("xchgb %b0, %h0" : "=Q" (val) : "0" (val));
   return val;
}

...今天在浏览其他人的代码时,我看到他有类似的功能,如下所示:

static inline int16_t HisSwapInt16t(int16_t val)
{
   __asm__ ("xchgb %h0, %b0" : "+Q" (val));
   return val;
}

我的功能和功能(AFAICT)之间的差异是:

  1. 他指定“+ Q”而不是“= Q”
  2. 交换%h0和%b0的位置
  3. 他在函数结尾处没有:“0”(val)子句
  4. 据我所知,两种实现方式似乎都能正常工作,但内联汇编对我来说有点黑色,所以有人可以解释一下:

    1. 上面列出的三个差异的意义是什么?
    2. 两个实现中的一个是比另一个更好还是更快,还是它们都会等效执行?

1 个答案:

答案 0 :(得分:0)

  

他指定“+ Q”而不是“= Q”

     

他在函数结尾处没有:“0”(val)子句

+修饰符代表输入和输出操作数,因此无需添加输入列表,请检查CGG manual

  

交换%h0和%b0的位置

我想这并不重要,因为xchg指令在两个操作数之间进行内容交换。

  

两个实现中的一个是比另一个更好还是更快,还是它们都会等效执行?

为了找到最佳实现,我将编译两个并检查objdump编译器如何包装这些函数,因为核心函数将是相同的单个指令。

希望这有帮助!