5

我目前正在反转反汇编并偶然发现了一系列我不明白的指令:

给定一个对象指针在esi.

.text:00C20263                 cmp     dword ptr [esi+80h], 0
.text:00C2026A                 jnz     short loc_C2027D

如您所见,如果成员+0x80不为 0(成员是整数),则代码跳转到00C2027D

.text:00C2027D                 add     dword ptr [esi+80h], 0FFFFFFFFh
.text:00C20284                 jnz     short loc_C20291

这两个指令是我不太明白的。首先,成员增加0xFFFFFFFF;但是由于成员不是0,这不会超过32位整数的最大值吗?jnz指令何时跳转?

有人能指出这两条指令的目的是什么吗?

4

1 回答 1

16

对于有符号变量,0FFFFFFFFh 与 -1 相同,因此这是从值中减去 1 并检查是否将其设为零。编译器通常会发出“加负值”而不是子指令,大概是因为它允许重用编译器逻辑进行加法和减法。

于 2012-07-09T18:12:49.710 回答