如何检查 x86 程序集中是否设置了多个位?

Que*_*ous 3 binary x86 assembly bit-manipulation bit

我正在编写一个 x86 汇编程序,我想检查一个寄存器(它不是 0),看看是否有多个位打开。

有没有一种简单的方法可以做到这一点,或者我应该循环并移动直到看到第二组位或到达末尾?


我不需要设置位的总数,那就是

有没有比执行其中一项并检查更快的方法popcnt(x) > 1

Aki*_*nen 5

正如ecm几乎评论的那样,可以通过检查来检查一个值是否是 2 的幂

a) value != 0 &&
b) ((value - 1) & value) == 0
Run Code Online (Sandbox Code Playgroud)

然而,如果需要检查一个值是否超过 1 位,那么测试一下就足够了

c) ((value - 1) & value) != 0

lea  ebx, [eax - 1]
test eax, ebx ;  // Z flag is cleared on EAX having 2 or more bits
Run Code Online (Sandbox Code Playgroud)

也就是说:如果某个位(最初设置的位)被清除后值非零,则它必须设置了超过 1 个位。

BMI1 扩展有一条指令:清除最低有效位blsr,它也会相应地设置 ZF。

  • @ErikEidt:显然公式没有足够的括号:目的不是写“(x-1) & (x !=0)”,而是写“((x-1) & x) != 0”。 (2认同)