我正在尝试了解有关装配和拆卸的更多信息。
我的目标是使用调试器(olly)修改特定地址的编写方式。最好通过将数字递增一个数字(20,50等),我可以识别浮点数的地址(在这种情况下位于33B7420C
)。
当我在内存访问写入时设置断点时,它会将我带到00809B2E
,其中包含以下程序集:
FSTP DWORD PTR DS:[ESI+1224]
这个地址到底在做什么?我知道FPU寄存器有我正在寻找的号码,但不确定这个地址在做什么。
我最接近谷歌搜索是: What does MOV EAX, DWORD PTR DS:[ESI] mean and what does it do?
寄存器的副本显示以下内容:
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
任何帮助将不胜感激,谢谢!
答案 0 :(得分:15)
FSTP
存储从浮点寄存器堆栈(ST0
)顶部到指定存储区的浮点数。使用DWORD
修饰符意味着将写入32位浮点数。 P
后缀表示操作后将弹出浮点寄存器堆栈。
因此,实际上,该指令将1150.0
(作为32位浮点数)放在DS:[ESI+1224]
,然后弹出寄存器堆栈(导致ST0 = 0.0
,ST1 = 0.0
,ST2 = <empty>
等。)。
答案 1 :(得分:1)
它将ST0(1150.0)以单精度存储到您的地址。并从FPU堆栈中弹出所述值。
答案 2 :(得分:-3)
要添加50(0x32为十六进制为50):
mov eax, dword[ds:esi+0x1224]
add eax, 0x32
mov dword[ds:esi+0x1224], eax