2012-08-27 27 views
5

Próbuję dowiedzieć się więcej o montażu i demontażu. Moim celem jest modyfikacja sposobu pisania konkretnego adresu za pomocą debuggera (olly). Korzystnie zwiększając go o liczbę (20, 50 itd.) Mogę zidentyfikować adres liczby zmiennoprzecinkowej (w tym przypadku znajduje się pod 33B7420C).Co robi FSTP DWORD PTR DS: [ESI + 1224]?

Kiedy ustawić punkt przerwania na dostęp do pamięci napisać to doprowadza mnie do 00809B2E który posiada następujący montaż:

FSTP DWORD PTR DS:[ESI+1224]

Czym dokładnie jest to robić w ten adres? Wiem, że rejestr FPU ma numer, którego szukam, ale nie wiem, co robi ten adres.

Najbliżej przyjdę do googling jest: What does MOV EAX, DWORD PTR DS:[ESI] mean and what does it do?

Kopia rejestrów zawiera następujące informacje:

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 

Każda pomoc będzie mile widziane, dzięki!

+9

Powinieneś otrzymać kopię odwołania do zestawu x86 dla wyjaśnienia poszczególnych instrukcji. Pytanie o SO za każdym razem, gdy napotkasz instrukcję, nie skaluje się dobrze. –

Odpowiedz

14

FSTP przechowuje liczbę zmiennoprzecinkową z góry stosu rejestrów zmiennoprzecinkowych (ST0) do wyznaczonego obszaru pamięci. Użycie modyfikatora DWORD oznacza, że ​​zostanie zapisany 32-bitowy zmiennoprzecinkowy. Przyrostek P wskazuje, że stos rejestru zmiennoprzecinkowego zostanie zerwany po operacji.

Więc w efekcie ta instrukcja stawia 1150.0 (jako pływaka 32-bitowym) w DS:[ESI+1224], następnie wyskakuje stos rejestru (co powoduje ST0 = 0.0, ST1 = 0.0, ST2 = <empty>, etc.).

+0

Dzięki, jak powiedział @raymond, będę musiał przeczytać więcej na temat zespołu x86. Próbuję dodać wartość tego stosu o 50., ale nie wiem, jak to osiągnąć w zespole. Czy ładuje się rejestr i używa "FADD" wskazując na pewien adres pamięci, który zawiera 50.? Chyba będę musiał przeczytać więcej na temat montażu :( –

1

Zapisuje ST0 (1150.0) w pojedynczej precyzji do twojego adresu. I pojawienie się tej wartości ze stosu FPU.

-3

Aby dodać 50 (0x32 będąc hex do 50):

mov eax, dword[ds:esi+0x1224] 
add eax, 0x32 
mov dword[ds:esi+0x1224], eax