我正在逆转反汇编,偶然发现了一条我不理解的指令链:给定的是一个对象指针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,并检查是否使其为零.编译器通常会发出"添加负值"而不是子指令,大概是因为它允许重复使用编译逻辑进行加法和减法.