【问题标题】:what is wrong with my version of _bittestandset我的 _bittestandset 版本有什么问题
【发布时间】:2009-03-08 15:31:35
【问题描述】:

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

【问题讨论】:

    标签: gcc assembly intrinsics


    【解决方案1】:

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

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

    如果你想得到结果,你需要一条额外的指令来将进位标志放入其他输出寄存器。 (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 与你的确切版本运行一个简单测试用例的汇编输出可以给我们一些线索是哪里出了问题。

    【讨论】:

      【解决方案2】:

      不要使用 BTS 指令。它慢得可怕。更好的方法是使用简单的 shift+or 来实现它。作为奖励,您无需任何程序集就可以使用纯可移植的 C++ 来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        • 2014-06-29
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多