2

我一直在 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) 子句

据我所知,这两种实现似乎都可以正常工作,但内联汇编对我来说有点像魔法,所以有知识的人可以解释一下:

  1. 上面列出的三个差异有什么意义?
  2. 这两种实现中的一种是否比另一种更好或更快,或者它们的性能是否相同?
4

1 回答 1

0

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

他的函数末尾没有 : "0" (val) 子句

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

交换 %h0 和 %b0 的位置

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

这两种实现中的一种是否比另一种更好或更快,或者它们的性能是否相同?

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

希望这有帮助!

于 2012-06-12T21:17:59.700 回答