【问题标题】:FILD and FSTP instructionsFILD 和 FSTP 指令
【发布时间】:2013-12-08 16:05:39
【问题描述】:

正在做一个crackme,试图写一个keygen,我对一些FPU指令感到困惑。

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 的?

【问题讨论】:

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

标签: assembly floating-point x86 reverse-engineering x87


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多