我正在逆转反汇编,偶然发现了一条我不明白的指示链:
给定是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
指令何时跳转?
有人可能会指出这两条指令的目的是什么?
答案 0 :(得分:13)
对于有符号变量,0FFFFFFFFh与-1相同,因此这将从值中减去一个并检查是否使其为零。编译器通常会发出“添加负值”而不是子指令,大概是因为它允许重复使用编译逻辑进行加法和减法。