2013-02-10 59 views
0

執行的指令是JE帶零標誌跳轉到1?

0044B8B8 |> F745 14 000800>TEST DWORD PTR SS:[EBP+14],800 
0044B8BF |.^0F84 7BFFFFFF JE App.0044B840 

EBP點0022F38C所以+14爲​​哪個值00001002而我們的800測試(是嗎?),並JE相同JZ(右?)寄存器在兩條指令(EIP除外)之間似乎沒有改變;

EAX 00000039 
ECX 00000000 
EDX 00000000 
EBX 0022F3C9 
ESP 0022F37C ASCII "XY" 
EBP 0022F38C 
ESI CCCCCCCD 
EDI 004597E6 ASCII "XYZ" 
EIP 0044B8BF App.0044B8BF 
C 0 ES 0023 32bit 0(FFFFFFFF) 
P 1 CS 001B 32bit 0(FFFFFFFF) 
A 0 SS 0023 32bit 0(FFFFFFFF) 
Z 1 DS 0023 32bit 0(FFFFFFFF) 
S 0 FS 003B 32bit 7FFDD000(FFF) 
T 0 GS 0000 NULL 
D 0 
O 0 LastErr ERROR_SUCCESS (00000000) 
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE) 
ST0 empty -??? FFFF 00700070 00700070 
ST1 empty -??? FFFF 00F000F0 00F000F0 
ST2 empty -??? FFFF 005A0040 004E006A 
ST3 empty -??? FFFF 000E0005 006000EB 
ST4 empty -??? FFFF 1D0A67F9 E9A7BEF0 
ST5 empty 0.0000000000000006002 
ST6 empty 0.0000000000000006002 
ST7 empty 0.0000000000000006002 
       3 2 1 0  E S P U O Z D I 
FST 4000 Cond 1 0 0 0 Err 0 0 0 0 0 0 0 0 (EQ) 
FCW 037F Prec NEAR,64 Mask 1 1 1 1 1 1 

仍然是跳躍。誰能解釋爲什麼?

回答

2

我不太確定你的期望,但TEST is basically an AND instruction that does not store the result;

0x0800 BITWISE AND 0x1002 = 0 

並且由於結果爲零,所以進行跳轉。

+0

我想裝配上的底漆是不夠的..謝謝,在繼續之前我會再讀一些。 – natli 2013-02-10 19:38:14

+0

它似乎有點反直覺...'cmp'然後'je'儘管理所當然。 – JosephH 2013-02-10 19:39:45

+1

@natli我通常會去[本頁](http://en.wikibooks.org/wiki/X86_Assembly)快速查看各種說明,如果適合您,您可能需要查看。 – 2013-02-10 19:41:59

0

JZ和JE一樣。由於CMP指令是在不存儲結果的情況下進行相減,所以如果CMP的兩個操作數相等,則其差值爲零,並設置Z標誌。

而且,就像Joachim所說,TEST是AND而不存儲結果。