2012-07-09 62 views
4

我目前正在反向反汇编,偶然发现了一条我不明白的指令链: 给定的是一个对象指针,在esiASM:添加0xFFFFFFFF

.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指令何时跳转?

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

回答

13

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

+0

非常感谢。这点完全有意义。 – Paranaix 2012-07-09 18:19:52

+0

那么也许你应该把标记作为回答图标? – 2012-07-10 11:26:05

+0

@MihaiLabo我很抱歉,因为我读了这个答案,我没有能够按下它,然后简单地忘了它;) – Paranaix 2012-07-11 12:00:19