Assembly x86 ASM:超过1位的测试指令

Assembly x86 ASM:超过1位的测试指令,assembly,x86,Assembly,X86,我在玩汇编测试指令,但现在它把我弄糊涂了 AX=1110xB 测试单个位时 如果已设置,则zf=0,即测试AX,0001xB 如果未设置,则zf=1,即测试AX,0010xB 在这一点上,一切正常,但问题或我的困惑是,当我想在一条测试指令中测试多个位时。如果只设置了一个测试位,则zf=0。例如: AX=1110xB 测试AX,0110xB->zf=0两位均已设置 测试AX,0011xB->zf=0仅设置了1位,但我要求设置2位 测试AX,1110xB->zf=0设置三位 问题是:如果所有测试的位

我在玩汇编测试指令,但现在它把我弄糊涂了

AX=1110xB

测试单个位时

如果已设置,则zf=0,即测试AX,0001xB

如果未设置,则zf=1,即测试AX,0010xB

在这一点上,一切正常,但问题或我的困惑是,当我想在一条测试指令中测试多个位时。如果只设置了一个测试位,则zf=0。例如:

AX=1110xB

测试AX,0110xB->zf=0两位均已设置

测试AX,0011xB->zf=0仅设置了1位,但我要求设置2位

测试AX,1110xB->zf=0设置三位

问题是:如果所有测试的位都是1,我如何测试多个位并期望得到正结果zf=0?例如,在C/C++中,当您使用逻辑&检查位10101101和00000101的掩码时。。。或者我应该在组装时一次测试一个位吗

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

我尝试了两个不同的调试器,结果是一样的


感谢您的评论

您不能用一条指令检查多个非零位;正如您所注意到的,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的情况下执行此操作,则需要将寄存器复制到其他位置或保存/恢复旧值。

不能用一条指令检查多个非零位;正如您所注意到的,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的情况下执行此操作,则需要将寄存器复制到其他位置或保存/还原旧值。

@kanito73:如果这回答了您的问题,您可以使用投票箭头下的复选框将答案标记为已接受。@kanito73:如果这回答了您的问题,您可以使用投票箭头下的复选框将答案标记为已接受。