这个LSB功能有什么作用?

时间:2016-11-30 12:34:55

标签: assembly

我认为以下代码(但不是100%肯定)计算给定64位整数的LSB。

不幸的是,我不了解实施情况。什么是bsfq?什么是=r

static inline unsigned lsb(uint64_t b)
{
    size_t idx;
    __asm__("bsfq %1, %0": "=r"(idx): "rm"(b));
    return idx;
}

1 个答案:

答案 0 :(得分:10)

BSF找到最低设置位的索引(如果有)。

q是AT& T语法的操作数大小后缀,这是多余的,因为寄存器目标操作数无论如何都意味着大小。

=中的=rmodifier,表示注册被覆盖。 r表示它必须是注册。 rm可以是寄存器或内存操作数。请参阅gcc inline-asm docs代码wiki。

我建议您用__builtin_ffsll替换它,因为编译器可以推断出这一点,但不是关于内联汇编(除了它可以从约束/ clobbers中得知)。 (https://gcc.gnu.org/wiki/DontUseInlineAsm