2013-11-23 200 views
2

正在做一个破解,试图写一个keygen,我对某些FPU指令感到困惑。FILD和FSTP指令

fild qword ptr ss:[esp] ; loads 4275451536.0000000000 into ST0. ESP has FED63690 
lea  esp, dword ptr ss:[esp+8] 
fstp qword ptr ss:[ebp-410] ; loads D2000000 into ebp - 410 
fld  qword ptr ss:[ebp-410] ; loads 4275451536.0000000000 into ST0 
fstp qword ptr ss:[esp+8] ; loads D2000000 into esp+8 

我想知道它是如何在弹出时将4275451536.0000000000转换为D2000000?

+0

FILD假定8字节内存操作数是64位整数。当第一条指令执行时,SS的位置究竟是什么:[ESP]? –

回答

7

该代码将值4275451536.0作为双精度浮点值写入地址[ebp-410]。作为IEEE-754双精度浮点的4275451536.0的表示形式是41EFDAC6D2000000(可以执行转换here)。由于您只查看了较低的4个字节,您看到了D2000000,但您应该查看整个8个字节以查看整个值。

如果您想知道41EFDAC6D2000000的值是如何达到的,请阅读double precision floating point format。我上面链接的工具将为您提供有效数和指数的值。