2012-08-27 52 views
5

Estoy intentando obtener más información sobre el montaje y el desmontaje. Mi objetivo es modificar la forma en que se escribe una dirección específica utilizando un depurador (olly). Preferiblemente al incrementarlo por un número (20, 50, etc.) puedo identificar la dirección del número de punto flotante (en este caso ubicado en 33B7420C).¿Qué hace FSTP DWORD PTR DS: [ESI + 1224]?

Cuando me puse un punto de interrupción en el acceso a la memoria escribir que me lleva a 00809B2E que tiene la siguiente montaje:

FSTP DWORD PTR DS:[ESI+1224]

¿Qué es exactamente está haciendo en esta dirección? Sé que el registro FPU tiene el número que estoy buscando, pero no estoy seguro de lo que está haciendo esta dirección.

Lo más cerca que yo venga a googlear es: What does MOV EAX, DWORD PTR DS:[ESI] mean and what does it do?

Una copia de los registros muestra lo siguiente:

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 

Cualquier ayuda se agradece, gracias!

+9

usted debe conseguir una copia de la referencia de ensamblado X 86 para la explicación de las instrucciones particulares. Pedir SO cada vez que te encuentres con una instrucción no escala bien. –

Respuesta

14

FSTP almacena un número de punto flotante desde la parte superior de la pila de registros de coma flotante (ST0) a la región de memoria designada. El uso del modificador DWORD significa que se escribirá un flotante de 32 bits. El sufijo P indica que la pila de registro de punto flotante se abrirá después de la operación.

Así que, en efecto, esta instrucción pone 1150.0 (como un flotador de 32 bits) en DS:[ESI+1224], a continuación, hace estallar la pila de registros (que causa ST0 = 0.0, ST1 = 0.0, ST2 = <empty>, etc.).

+0

Gracias como dijo @raymond, tendré que leer más sobre el ensamblaje x86. Estoy intentando agregar el valor de esa pila por 50. pero no sé cómo lograr esto en el ensamblaje. ¿Es cargar el registro y usar 'FADD' apuntando a alguna dirección de memoria que contiene 50.? Creo que tendré que leer más sobre el montaje :( –

1

Está almacenando ST0 (1150.0) en una sola precisión en su dirección. Y sacando dicho valor de la pila de FPU.

-3

Para agregar 50 (0x32 hexadecimal para ser 50):

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