2012-07-09 47 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