6

我正在尝试更多地了解组装和拆卸。我的目标是修改使用调试器(olly)编写特定地址的方式。最好通过将其增加一个数字(20、50 等)。我可以识别浮点数的地址(在这种情况下位于33B7420C)。

当我在内存访问写入上设置断点时,它会将我带到00809B2E具有以下程序集的位置:

FSTP DWORD PTR DS:[ESI+1224]

它到底在这个地址做什么?我知道 FPU 寄存器有我正在寻找的号码,但不确定所有这些地址在做什么。

我最接近谷歌搜索的是: MOV EAX, DWORD PTR DS:[ESI] 是什么意思,它有什么作用?

寄存器的副本显示以下内容:

EAX 00000000
ECX 00A16E40 EZ.00A16E40
EDX FFFFFFFF
EBX 33B74578
ESP 0018FA90
EBP 00000000
ESI 33B72FE8
EDI 33B74578
EIP 00809B2E <EZ.Breakpoint for time>
C 0  ES 002B 32bit 0(FFFFFFFF)
P 0  CS 0023 32bit 0(FFFFFFFF)
A 0  SS 002B 32bit 0(FFFFFFFF)
Z 0  DS 002B 32bit 0(FFFFFFFF)
S 0  FS 0053 32bit 7EFDD000(FFF)
T 0  GS 002B 32bit 0(FFFFFFFF)
D 0
O 0  LastErr ERROR_SUCCESS (00000000)
EFL 00210202 (NO,NB,NE,A,NS,PO,GE,G)
ST0 valid 1150.0000000000000000
ST1 zero  0.0
ST2 zero  0.0
ST3 empty 64.951911926269531250
ST4 empty -13.250000000000000000
ST5 empty 64.951911926269531250
ST6 empty 64.951911926269531250
ST7 empty 0.0239995196461677551
           3 2 1 0      E S P U O Z D I
FST 2927  Cond 0 0 0 1  Err 0 0 1 0 0 1 1 1  (LT)
FCW 027F  Prec NEAR,53  Mask    1 1 1 1 1 1

任何帮助将不胜感激,谢谢!

4

3 回答 3

15

FSTP将浮点数从浮点寄存器堆栈 ( ST0) 的顶部存储到指定的内存区域。使用DWORD修饰符意味着将写入 32 位浮点数。后缀表示运算后会P弹出浮点寄存器堆栈。

因此,实际上,该指令将1150.0(作为 32 位浮点数)放入DS:[ESI+1224],然后弹出寄存器堆栈(这会导致ST0 = 0.0ST1 = 0.0ST2 = <empty>等)。

于 2012-08-27T00:22:54.063 回答
1

它以单精度将 ST0 (1150.0) 存储到您的地址。并从 FPU 堆栈中弹出所述值。

于 2012-08-27T00:22:39.943 回答
-3

添加 50(0x32 是 50 的十六进制):

mov eax, dword[ds:esi+0x1224]
add eax, 0x32
mov dword[ds:esi+0x1224], eax
于 2014-10-26T23:17:54.257 回答