6

組み立てと分解についてもっと知りたいと思っています。私の目標は、デバッガーを使用して特定のアドレスが書き込まれる方法を変更することです(完全に)。できれば、数値(20、50など)でインクリメントすることで、浮動小数点数のアドレス(この場合はにあります)を識別できます33B7420C

メモリアクセス書き込みにブレークポイントを設定すると00809B2E、次のアセンブリが含まれるようになります。

FSTP DWORD PTR DS:[ESI+1224]

このアドレスで正確に何をしているのですか?FPUレジスタに探している番号があることは知っていますが、このアドレスが何をしているのかわかりません。

私がグーグルに最も近いのは 、MOV EAX、DWORD PTR DS:[ESI]とは何を意味し、それは何をするのかということです。

レジスタのコピーは次のことを示しています。

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

助けていただければ幸いです、ありがとう!

4

3 に答える 3

15

FSTP浮動小数点数を浮動小数点レジスタ スタック ( ST0) の先頭から指定されたメモリ領域に格納します。修飾子を使用DWORDすると、32 ビットの float が書き込まれます。サフィックスは、P演算後に浮動小数点レジスタ スタックがポップされることを示します。

したがって、実際には、この命令は に1150.0(32 ビット浮動小数点数として)置きDS:[ESI+1224]、レジスタ スタックをポップします (これによりST0 = 0.0ST1 = 0.0ST2 = <empty>などが発生します)。

于 2012-08-27T00:22:54.063 に答える
1

ST0 (1150.0) を単精度でアドレスに格納しています。そして、FPUスタックからその値をポップします。

于 2012-08-27T00:22:39.943 に答える
-3

50 を追加するには (0x32 は 50 の 16 進数):

mov eax, dword[ds:esi+0x1224]
add eax, 0x32
mov dword[ds:esi+0x1224], eax
于 2014-10-26T23:17:54.257 に答える