INC 指令如何影响奇偶校验标志?

逆向工程 部件 x86
2021-07-08 00:23:52

您能否解释一下INCx86 汇编指令如何影响奇偶校验标志 (PF)?

我有以下代码:

.text:00401413 mov     edi, offset user_id ; user_id at memory location 0x40D020
...
.text:00401421 inc     edi                 ; edi = 0x40D021
...
.text:0040142D inc     edi
.text:0040142E jnp     short no_parity

user_id 定义如下:

.bss:0040D020 user_id         db 21h dup(?)
.bss:0040D042                 db    ? ;
.bss:0040D043                 db    ? ;
.bss:0040D044                 db    ? ;
...

在偏移处0x40142D

0:000> r edi
edi=0040d021
0:000> dd 40d021
0040d021  4f4f4f4f 4f4f4f4f 4f4f4f4f 4f4f4f4f
0040d031  4f4f4f4f 4f4f4f4f 4f4f4f4f 004f4f4f
0040d041  00000000 00000000 00000000 00000000
0040d051  00000000 00000000 00000000 00000000
0040d061  00000000 00000000 00000000 00000000
0040d071  00000000 00000000 00000000 00000000
0040d081  00000000 ff000000 01000000 01000000
0040d091  02000000 00000000 01000000 00000000

如果我对奇偶校验标志的理解是正确的,它应该适用于低 8 位:01001111因为:

edi = 0x4f4f4f4f = 0b1001111010011110100111101001111

1in的数量01001111是奇数(五1),这应该将 PF 设置为1但这种情况并非如此:

0:000> r pf
pf=1

...这导致不会在 offset 处进行跳转0x40142E

谢谢您的帮助。

1个回答

奇偶校验标志是“如果结果的最低有效字节包含偶数个 1 位则置位;否则清零”。

来源:http : //www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf 的第 3.4.3.1 节

所以 edi = 0x0040d021 => least significant byte = 0x21

0x21 = 0b00100001 = 2 bits set = even number of bits sets => PF set

(不清楚您为 edi 提供的值是在 之前还是之后inc。如果在之前,则在incedi 之后将等于0x0040d022,它仍然设置了 2 位。)