我的_bittestandset版本有什么问题

时间:2009-03-08 15:31:36

标签: gcc assembly intrinsics

我是汇编语言的新手。似乎gcc在intrin.h中没有像MSVC那样的_bittestandset函数,所以我实现了一个新函数。这个在linux中运行良好,但在winVista机器上mingw出错了,代码是:

inline unsigned char _bittestandset(unsigned long * a, unsigned long b)
{
    __asm__ ( "bts %1, %[b]"
          : "=g"(*a)
          : [b]"Ir"(b), "g"(*a) );
    return 0;
}

2 个答案:

答案 0 :(得分:3)

你能否进一步解释什么不起作用?也许是一个简单的用法例子。很难猜出代码有什么问题..

到目前为止看起来很俗气的一件事:你执行一个比特测试操作码但忽略了结果。您测试(和设置)的位在操作码之后的进位标志中结束。

如果要获得结果,则需要额外的指令将进位标志放入其他输出寄存器。 (SBB EAX,EAX或类似的东西)。

否则 - 如果你不需要结果 - 用三个更简单的汇编程序操作码替换BTS指令要便宜得多:

这些方面的东西:

  ; bit-index in cl
  ; Value in ebx
  ; eax used as a temporary (trashed)
  mov eax, 1
  shl eax, cl
  or  ebx, eax

由于我没有使用你的确切版本运行一个简单的测试用例的汇编输出可以给我们一些线索是什么问题。

答案 1 :(得分:-1)

请勿使用BTS指令。它非常缓慢。更好的方法是使用简单的shift +或它来实现它。作为奖励,你可以在没有任何组装的情况下使用纯粹的可移植C ++来实现。