2014-03-04 24 views
-1

我已經反彙編了我的測試C程序,這是代碼的一部分,我不確定我是否理解正確。ASM和重複條件檢查,爲什麼?

00401143: 83 F8 01   cmp   eax,1 
00401146: 0F 84 F4 00 00 00 je   00401240 
0040114C: 85 C0    test  eax,eax 
0040114E: 0F 85 A0 00 00 00 jne   004011F4 
00401154: 31 C0    xor   eax,eax 

所以基本上,這是我的理解:

  1. 檢查eax等於1,如果是返回0
  2. 如果0,跳到00401240,如果沒有,繼續
  3. 測試==因此我已經知道它會返回1,因爲沒有辦法eax可以等於0,因爲它會跳到00401146我想知道爲什麼我應該叫這個test。爲什麼我不能簡單地將testjne替換爲單個jmp(無條件跳轉),我們只有在eax等於1的情況下才能達到。
  4. 如果沒有0(因此1),跳轉到004011F4 - 這總是會發生
  5. 我們絕不會從這個角度達到00401154(我們可以假設那麼就一定要調用/跳轉)代碼這將某處導航我們到00401154

這是正確的還是有東西,我沒有正確理解?

+1

'je'會如果'EAX告吹!= 1',然後'test'會給你一個'EAX> 1' true或'EAX == 0'false,然後將它用於'jne'或者通過......這個反彙編的C代碼是什麼樣子的? – abiessu

+0

序列cmp eax,1 |如果eax == 1,je 401240會跳轉。除非代碼中的其他地方跳轉到401154,否則不需要xor eax,eax,因爲只有在文本中eax == 0才能到達那裏eax,eax | jne 4011F4序列。 – rcgldr

回答

0

這很可能是由編譯器簡單地進行了非常優化的代碼,但要解釋它做了什麼,在徹底時添加了按位「測試」來查找除最初尋找的1之外的任何其他值。

編譯器已生成代碼來評估EAX是0還是1,並且嚴格沒有其他值。

if(a==1){...} 
else if(a<>0){...} 

...

00401143: 83 F8 01   cmp   eax,1  ...EAX is 1? 
00401146: 0F 84 F4 00 00 00 je   00401240 ...EAX is 1... 
0040114C: 85 C0    test  eax,eax ...EAX is strictly 0? (eax & eax) 
0040114E: 0F 85 A0 00 00 00 jne   004011F4 ...EAX is another value