2012-08-27 26 views
5

Sto cercando di saperne di più su assemblaggio e smontaggio. Il mio obiettivo è modificare il modo in cui un indirizzo specifico viene scritto usando un debugger (olly). Preferibilmente incrementandolo di un numero (20, 50, ecc.) Posso identificare l'indirizzo del numero in virgola mobile (in questo caso situato a 33B7420C).Cosa fa FSTP DWORD PTR DS: [ESI + 1224]?

Quando ho creato un punto di interruzione di accesso alla memoria scrivere mi porta a 00809B2E che ha la seguente assemblea:

FSTP DWORD PTR DS:[ESI+1224]

Che cosa sta facendo in questo indirizzo? So che il registro FPU ha il numero che sto cercando ma non sono sicuro di cosa stia facendo tutto questo indirizzo.

Il più vicino io vengo a googling è: What does MOV EAX, DWORD PTR DS:[ESI] mean and what does it do?

Una copia dei registri evidenzia quanto segue:

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 

Qualsiasi aiuto sarebbe apprezzato, grazie!

+9

si dovrebbe ottenere una copia del riferimento assembly x86 per le spiegazioni di particolari istruzioni. Chiedere a SO ogni volta che incontri un'istruzione non si adatta bene. –

risposta

14

FSTP memorizza un numero a virgola mobile dalla parte superiore dello stack di registri a virgola mobile (ST0) nell'area di memoria designata. L'uso del modificatore DWORD significa che verrà scritto un float a 32 bit. Il suffisso P indica che lo stack del registro a virgola mobile verrà estratto dopo l'operazione.

Così, in effetti, questa istruzione mette 1150.0 (come float a 32 bit) a DS:[ESI+1224], quindi si apre la pila registro (che causa ST0 = 0.0, ST1 = 0.0, ST2 = <empty>, ecc).

+0

Grazie come @raymond ha detto, dovrò leggere di più sull'assemblaggio x86. Sto cercando di aggiungere il valore di quella pila di 50., ma non so come raggiungerlo in assemblea. Carica il registro e usa 'FADD' puntando su qualche indirizzo di memoria che contiene 50.? Immagino che dovrò leggere di più sul montaggio :( –

1

Memorizza ST0 (1150.0) in precisione singola al proprio indirizzo. E scoppiando detto valore dallo stack FPU.

-3

Per aggiungere 50 (0x32 essendo esadecimale per 50):

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