Assembly 如何使用测试指令查看是否设置了两位?
您如何使用测试指令(或一系列测试指令)查看位是否正确 AL寄存器中的0和4都设置为1?测试说明是怎样的 用于查看是否设置了任一位?如何使用测试指令查看两个位是否都未设置? 我使用emu8086汇编程序 (请参见类似问题。) 使用Assembly 如何使用测试指令查看是否设置了两位?,assembly,emu8086,Assembly,Emu8086,您如何使用测试指令(或一系列测试指令)查看位是否正确 AL寄存器中的0和4都设置为1?测试说明是怎样的 用于查看是否设置了任一位?如何使用测试指令查看两个位是否都未设置? 我使用emu8086汇编程序 (请参见类似问题。) 使用TEST,可以屏蔽17(0b10001,即设置位0和位4) 然后: ZF如果至少设置了一位(位0或位4),则将0 如果设置了两位或零位,PF将为1 所以在测试之后: 不ZF和PF-两个位都已设置 非ZF但非PF-一位设置 ZF-两个位均未设置 以下是一个完整的示例
TEST
,可以屏蔽17(0b10001
,即设置位0和位4)
然后:
如果至少设置了一位(位0或位4),则将ZF
0
- 如果设置了两位或零位,
将为PF
1
测试之后
:
- 不
和ZF
-两个位都已设置PF
- 非
但非ZF
-一位设置PF
-两个位均未设置ZF
TEST AL, 17
JZ none_set
JPE both_set
one_set:
...
none_set:
...
both_set:
...
请注意,这仅在检查2位的情况下有效,特别是在屏蔽结果的最低有效字节中
最好使用和以及CMP
使用x&mask==mask
测试3位或更多位。(这对于2位的情况也很有效,允许您在两条其他指令之后只使用一个分支,而不是在一次测试之后使用两个分支)
如何使用测试指令(或测试指令序列)查看AL寄存器中的位0和位4是否都设置为1
您可以使用Aurel Bílý的答案中的奇偶校验标志技巧——尽管如前所述,只有当两个位都处于低位8位时,该技巧才有效
下面是一个简单的方法,包含多个测试说明:
test al, 16
jz not_both_set
test al, 1
jz not_both_set
both_set:
...
not_both_set:
等效地,最后一个条件分支可以反转:
test al, 16
jz not_both_set
test al, 1
jnz both_set
not_both_set:
...
both_set:
这里有另一种方法,它不使用测试
,而是使用一个临时寄存器,并对该寄存器执行和然后执行cmp
:
mov ah, al
and ah, 17
cmp ah, 17
jne not_both_set
both_set:
...
not_both_set:
如何使用测试指令查看是否设置了任何一位
只需为掩码提供设置为测试
指令的两个位,零标志清除(非零)意味着至少设置了一个位
如何使用测试指令查看两个位是否都未设置
再次使用两个位的掩码,设置零标志意味着两个位都没有设置。对不起,ZF
在所有情况下不是在文本之后都反转了吗,所以在测试之后
:???也就是说,不ZF
和PF
->这两个位都被设置;不ZF
和不PF
->一位设置ZF
(和PF
)->两个位均未设置。我只是想理解。多谢各位@眠りネロク 是的,你说得对!更正,抱歉造成混淆:)@AurelBílý感谢您的确认。@Jαcκsσý:我为这个答案添加了一个示例。@ecm您是一个救星。谢谢。是的,x&mask==mask
是测试所有设置位的正常方法。即使您需要保存一份x
供以后使用,它通常也比两个分支更有效。
mov ah, al
and ah, 17
cmp ah, 17
jne not_both_set
both_set:
...
not_both_set: