Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何使用测试指令查看是否设置了两位?_Assembly_Emu8086 - Fatal编程技术网

Assembly 如何使用测试指令查看是否设置了两位?

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-两个位均未设置 以下是一个完整的示例

您如何使用测试指令(或一系列测试指令)查看位是否正确 AL寄存器中的0和4都设置为1?测试说明是怎样的 用于查看是否设置了任一位?如何使用测试指令查看两个位是否都未设置? 我使用emu8086汇编程序

(请参见类似问题。)

使用
TEST
,可以屏蔽17(
0b10001
,即设置位0和位4)

然后:

  • ZF
    如果至少设置了一位(位0或位4),则将
    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: