x86 ASM:1位以上的TEST指令

时间:2018-11-18 03:48:24

标签: assembly x86

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

AX = 1110xB

测试一位时,

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

如果未设置,则zf = 1(即TAX 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,则给出“正”。

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

感谢您的评论

1 个答案:

答案 0 :(得分:3)

您不能用一条指令检查多个非零位;您会注意到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

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

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

相关问题