x86 ASM:超过 1 位的 TEST 指令

kan*_*o73 1 x86 assembly

我正在使用汇编 TEST 指令,但目前它让我感到困惑。

AX=1110xB

当测试单个位时,

如果已设置,则 zf=0(即 TEST AX,0001xB)

如果未设置则 zf=1(即 TEST AX,0010xB)

此时一切正常,但问题(或我的困惑)是当我想在单个 TEST 指令中测试多个位时。如果仅设置了测试位之一,则 zf=0。例如:

AX=1110xB

TEST AX,0110xB -> zf=0(两个位均已设置)

TEST AX,0011xB -> zf=0(只设置了 1 位,但我要求 2 位)

TEST AX,1110xB -> zf=0(三位已设置)

问题是:如何测试多个位并仅当所有测试位均为“1”时才期望得到正结果(zf=0)?例如,在 C/C++ 中,当您使用逻辑 & 来检查位掩码 (10101101&00000101)...或者我应该在汇编中一次测试一位?

如果未设置位,我的程序会给出“负”,但如果至少设置了 1 位并且并非所有测试的位都为 1,则给出“正”。

我尝试使用两种不同的调试器,结果是相同的。

感谢您的意见

Pet*_*des 5

您无法使用一条指令检查多个非零位;正如您所注意到的,ZF 的设置取决于结果中是否有非零位。

通常的方法是

and  AX, mask        ; clear all the non-mask bits
cmp  AX, mask        ; check that all the mask bits *are* set
je  all_bits_set
Run Code Online (Sandbox Code Playgroud)

(其中mask是寄存器或您使用两次的相同立即数。)

如果您需要在不破坏 AX 的情况下执行此操作,则需要将寄存器复制到其他位置或保存/恢复旧值。