0

実行される命令は、

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

EBP0022F38Cは、+14 が800 をテストしている間の0022F3A0値(右?) であり、(右?) と同じであることを示しています。レジスタは 2 つの命令間で変更されていないようです (EIP を除く)。00001002JEJZ

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

それでもジャンプは行われます。誰でも理由を説明できますか?

4

2 に答える 2

2

何を期待しているのかよくわかりませんが、TEST基本的には結果を格納しないAND命令です。

0x0800 BITWISE AND 0x1002 = 0

結果がゼロなので、ジャンプが行われます。

于 2013-02-10T19:34:06.807 に答える
0

JZはJEと同じです。CMP 命令は結果を格納しない減算であるため、CMP の 2 つのオペランドが等しい場合、それらの差はゼロであり、Z フラグがセットされます。

そして、Joachim が言ったように、TEST は AND であり、結果を保存しません。

于 2013-02-11T00:22:58.083 に答える