0

执行的指令是

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

EBP 指向0022F38C所以 +14 是我们测试 800 时的0022F3A0哪个值(对吗?)并且与(对吗?)寄存器似乎在两条指令之间没有改变(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 的两个操作数相等,则它们的差为零,并设置 Z 标志。

而且,就像 Joachim 所说, TEST 是 AND 而不存储结果。

于 2013-02-11T00:22:58.083 回答