我对一个应用程序进行逆向工程,如果数量为负数,通常会将4.294967296e9加到双精度。反汇编的一部分:

mov     eax, label_to_memory
fild    label_to_memory
test    eax, eax
jge     short some_label
fadd    ds:some_double_value
some_label:


如果我是正确的,那么如果未设置最高位(即其为正数),则会执行跳转。 some_double_value指向常数4.294967296e9

要了解一段代码的作用,我需要知道为什么要加上这个特定数字,我发现的唯一信息是http中的一行代码: //web.mit.edu/~mkgray/afs/bar/afs/net/project/attic/quipu/isode-8.0/others/ntp/ntpsubs.c,其中说

#ifdef  VAX_COMPILER_FLT_BUG
    if (b < 0.0) b += 4.294967296e9;
#endif


那么,该数字的意义是什么?

其他信息:该数字不能为负,因此实际上永远不会发生。

#1 楼

我在写这个问题时实际上找到了答案!

这个数字恰好是UINT_MAX + 1,以双精度形式存储。因此,似乎这段代码将无符号整数转换为双精度型。 fild指令将32位值作为有符号值加载,在加上最大可能的无符号值+ 1之后,双精度值包含的值与无符号整数相同。像这样:

unsigned int num; // some arbitrary 32 bit unsigned number
double d = num;


由于花了我一些时间才弄清楚,所以我认为它可以帮助别人比我更快地找到解决方案。