【问题标题】:intel assembly TEST PF flag operationintel 程序集 TEST OF 标志操作
【发布时间】:2018-05-04 09:52:37
【问题描述】:

我正在使用TEST (Parity flag operation) 进行手动操作,问题是我无法得到正确的结果,请考虑一下:

ax = 256 = 0000 0001 0000 0000

如果我这样做:

test ah, 0x44

PF 标志操作应该是:

0000 0000 =0000 0001&0100 0100

PF = 0000 0000 XNOR 0000 0000

PF = 1111 1111?

我已经按照英特尔的参考,根据这个:

问题是我做错了什么?

【问题讨论】:

  • 如果您尝试设置或重置 PF 标志,您可以使用 lahf instruction 执行此操作,看看我的回答 stackoverflow.com/questions/41335653/…
  • @Doda 不,我想手动做公式,问题是我没有得到与程序操作相同的结果......
  • 您阅读的参考资料有误。首先,参数是TEMP[0:7],但您使用的是TEMP[15:8]。其次,BitwiseXNOR 只有一个参数,所以不清楚为什么要计算0000 0000 XNOR 0000 0000(特别是因为结果有 8 位,而 PF 只有一位)。 BitwiseXNOR 的意思是将所有位异或,然后取反。
  • 我不明白您是否要设置/重置 PF 标志?
  • @Raymond Chen 你能发一个例子或链接例子吗?我找不到类似示例的操作,你的意思是bit0 to bit7 xorged and then negated? 类似~(0^0^0^0^0^0^0)

标签: assembly flags operation parity


【解决方案1】:

BitwiseXNOR 是位的水平 XNOR,产生一个位。请记住,PF 只有 1 位宽(EFLAGS 中的一个标志),所以写 PF=1111 1111 是没有意义的。


与“根据结果设置标志”的指令的奇偶校验计算相同,除了它是在test 的内部临时结果上完成的。 (和往常一样,在它的低 8 位上,无论操作数大小如何)。

如果设置的位数是奇数,PF = 0,如果设置的位数是偶数,则 PF = 1。所以是的,您在 cmets 中发布的表达式 ~(0^0^0^0^0^0^0^0) 是正确的。

另见:

  • https://en.wikipedia.org/wiki/Parity_flag
  • https://en.wikipedia.org/wiki/Parity_bit 指出奇偶校验也是所有位的倒数(sum mod 2)。 (因为XOR 是无进位加法)。可以使用popcnt eax, eax/not eax/and eax, 1 计算宽于 8 位的整数的奇偶校验。 (或者使用 BMI andn eax, eax, ecx 并在循环外设置 ecx=1 在一条指令中执行非和部分。)或者只使用反转奇偶校验值,其中 1 = 奇校验。

This answer 有几个示例说明如何根据结果中位的水平异或设置 PF。在您的情况下,这 8 位是 test 内部生成的 AND 结果。

【讨论】:

  • 是的,我对 BitwiseXNOR(Temporary[0:7]); 的逻辑很糟糕,因为我做错了...谢谢...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多