2009-04-13 83 views
2

我正在研究一个从表达式产生汇编代码的程序。其中一个需要的功能是棕褐色(x)的目前工程,并使用下面的代码序列(地址在运行时填写):为什么printf为FPTAN结果显示-1。#IND?

fld [0x00C01288]; 
fld st(0); 
fsin; 
fld st(1); 
fcos; 
fdivp; 
fst [0x0030FA8C]; 

不过,我想用FPTAN操作码代替,因此我尝试使用以下代码:

fld [0x00C01288]; 
fptan; 
fincstp; 
fst [0x0030FA8C]; 

该测试程序使用的printf来显示储存在0x30FA8C的结果,但对于第二序列中的结果显示为-1#IND(使用COS和sin作品第一。精细)。如果我尝试在调试器中检查内存地址或浮点堆栈顶部的值,它将显示为正确的数字。

所以,我的问题是:为什么printf显示-1。#IND,我该如何解决它?

在0x00C01288的值是双精度0.5 在这两种情况下的结果是〜0.5463024898

我首先想到的是,该值被存储为相同数量的不同表示,但检查等储存在0x0030FA8C值在两种情况下都显示为0x3FE17B4F5BF3474A。

我不明白,为什么相同的输入printf函数可以产生不同的输出...

任何帮助或建议,将不胜感激。

编辑:来源,其中的printf被称为:

#include "FridgeScript.h" 
#include <stdio.h> 
#include <math.h> 

char test[] = "a=tan(0.5);"; 

int main(int c, char** s) 
{ 
    unsigned int SC = FSCreateContext(); 

    double a = 0.0; 
    FSRegisterVariable(SC, "a", &a); 

    unsigned int CH = FSCompile(SC, test); 
    if(CH) FSExecute(SC, CH); 

    printf("a: %.10g\r\n", a); 
    printf("hex a: %I64X", a); 

    FSDestroyContext(SC); 
    return 0; 
} 
+0

你可能会显示使用printf函数的源代码吗? – veefu 2009-04-13 12:33:03

+0

还有很多其他的事情......但我会加入它。 – jheriko 2009-04-13 12:45:32

+1

“-1。#IND”是printf说NaN的方式。我没有其他帮助来添加,但这可能是一个有用的琐事...... – RBerteig 2009-04-17 07:56:37

回答

9

让我扔出来的东西有:怎么样使用

fstp st(0); 

,而不是

fincstp; 

上FINCSTP的文档说它不等同于从堆栈中弹出该项目,因为它会将该点标记为已填充 - 也许这弄乱了printf内部的浮动处理?

(您可以猜到,我不知道我在说什么。但也许这会给你的想法?)

+0

这固定完美。谢谢。我想va_args依赖于带有printf调用约定的浮点堆栈... – jheriko 2009-04-13 13:02:47

+0

通常,printf()使用堆栈来存放参数,也可能使用x86-64上的某些寄存器。它知道通过解析格式字符串来查找多少个参数。当printf()试图使用FPU时,IMO发生了这个问题。 – 2009-04-13 13:12:43

+0

对于一个不知道他们在说什么的人来说,这是一个相当不错的猜测:-) +1是一个很好的猜测。 – paxdiablo 2009-04-13 13:29:05

1
fld [0x00C01288]; 
fptan; 
fincstp; 
fst [0x0030FA8C]; 

对我来说,它看起来像这样的代码执行后,切线仍然在st0。你不应该使用fstp而不是fst

+0

这听起来与我的答案有关。 fp堆栈中仍然有东西。 – 2009-04-13 12:56:40

+0

fst应将其存储在0x0030FA8C处,并且调试器显示它确实在那里写入。由于st(0)用于返回值,所以它必须留在那里以便表达式可以像例如“a = b = tan(0.5);” – jheriko 2009-04-13 13:03:25

0

也许你的FST指令只存储float结果,而第二个dword仍然是未经初始化的?

我在汇编代码中看不到任何大小的前缀。通常你会看到类似于:

FST [dword ptr some_address] 

    or 

    FS [qword ptr some_address] 
相关问题