遇到不懂的指令,不用到網上查,自己用OD測試一下就知道了。
neg a
neg指令執行的操作是把a的每個二進制位取反之后再加1。效果就是數學上的求相反數,比如neg 3的結果就是-3,neg -3的結果就是3. neg 0的結果就是0
經過測試發現,neg a 不管a是正數還是負數,都會置CF為1這就很奇怪,按照先按位取反再加1的操作來說,更本沒產生進位啊,為什么要置CF為1呢?
后來查詢到intel手冊。
neg a這個操作相當於0-a,這個過程會產生借位,借位了那么CF就是1了。
總結一下用neg指令可以確定一個操作數是不是0。是0則CF=0,不是0則CF=1.
sbb指令是帶借位的減法
sbb a,b 執行的操作是a-b-CF
看一下neg和sbb配合的指令
neg a
sbb a,a
如果a是0,那么neg之后結果是CF=0 sbb之后的結果就是0-0-0=0
如果a是非0,那么neg之后結果是CF=1,sbb之后的結果就是a-a-1=-1
看一下仙劍4戰斗系統里面一段代碼
PAL4.exe+12DFA4 - E8 17650500 - call PAL4.exe+1844C0 { 是5的時候調用call
}
PAL4.exe+12DFA9 - F6 D8 - neg al
PAL4.exe+12DFAB - 1B C0 - sbb eax,eax
PAL4.exe+12DFAD - 40 - inc eax
PAL4.exe+12DFAE - C3 - ret
PAL4.exe+12DFAF - 32 C0 - xor al,al
PAL4.exe+12DFB1 - C3 - ret
調用完一個函數之后拿到返回值用neg和sbb指令來判斷函數結果是0還是非0,如果是0,那么sbb之后 eax的結果還是0 inc eax之后結果是1,如果是非0,那么sbb之后
eax的結果是-1,inc eax結果之后就是0。
所以這段代碼的意思是調用一個函數,如果結果是0,那么返回1,如果是非0,那么返回0