这个LSB功能有什么作用?

Sma*_*ess 1 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;
}
Run Code Online (Sandbox Code Playgroud)

har*_*old 10

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

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

==r是一个修改器说,寄存器被覆盖.这r意味着它必须是一个登记册.rm可以是寄存器或内存操作数.请参阅gcc inline-asm文档标记wiki.

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