我正在使用汇编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,则给出“正”。
我尝试使用两个不同的调试器,结果是相同的。
感谢您的评论
答案 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的情况下执行此操作,则需要将寄存器复制到其他位置或保存/恢复旧值。