0

我是汇编语言的新手。似乎 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;
}
4

2 回答 2

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

由于我没有 mingw 与您运行简单测试用例的汇编输出的确切版本可以给我们一些线索,知道出了什么问题。

于 2009-03-08T16:27:53.700 回答
-1

不要使用 BTS 指令。它慢得可怕。更好的方法是使用简单的 shift+or 来实现它。作为奖励,您可以在没有任何汇编的情况下使用纯可移植的 C++ 来完成它。

于 2009-06-30T21:03:29.423 回答