2012-08-27 154 views
5

我想了解更多關於裝配和拆卸的信息。 我的目標是修改使用調試器(olly)編寫特定地址的方式。最好通過增加一個數字(20,50等),我可以識別浮點數的地址(在這種情況下位於33B7420C)。FSTP DWORD PTR DS:[ESI + 1224]做什麼?

當我設置內存訪問斷點寫它帶給我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 

任何幫助,將不勝感激,謝謝!

+9

你應該得到的x86彙編引用的副本用於特定指令的解釋。每次你遇到一個指令時都會問這個問題並不好。 –

回答

14

FSTP存儲從浮點寄存器堆棧頂部(ST0)到指定內存區域的浮點數。使用DWORD修飾符意味着將寫入32位浮點數。後綴P表示操作後將會彈出浮點寄存器堆棧。

因此,在實際上,這指令使1150.0(作爲32位浮點)在DS:[ESI+1224],然後彈出寄存器堆棧(導致ST0 = 0.0ST1 = 0.0ST2 = <empty>等)。

+0

感謝@raymond說,我將不得不在x86程序集上閱讀更多內容。我試圖將該堆棧的值加上50.但我不知道如何在彙編中實現這一點。是否加載寄存器並使用'FADD'指向包含50的某個內存地址?我想我將不得不閱讀更多關於裝配:( –

1

它將ST0(1150.0)以單精度存儲到您的地址。並從FPU堆棧彈出所述值。

-3

加50(0x32十六進制是50):

mov eax, dword[ds:esi+0x1224] 
add eax, 0x32 
mov dword[ds:esi+0x1224], eax 
相關問題