ASM:添加0xFFFFFFFF

Seb*_*ann 4 x86 assembly

我正在逆转反汇编,偶然发现了一条我不理解的指令链:给定的是一个对象指针esi.

.text:00C20263                 cmp     dword ptr [esi+80h], 0
.text:00C2026A                 jnz     short loc_C2027D
Run Code Online (Sandbox Code Playgroud)

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

.text:00C2027D                 add     dword ptr [esi+80h], 0FFFFFFFFh
.text:00C20284                 jnz     short loc_C20291
Run Code Online (Sandbox Code Playgroud)

这两条指令是我真正理解的.首先,成员增加0xFFFFFFFF; 但由于该成员不为0,否则该指令是否会超过32位整数的最大值?jnz指令什么时候跳?

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

500*_*ror 13

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