为什么printf显示-1。#IND用于FPTAN结果?

时间:2009-04-13 12:19:11

标签: c++ assembly floating-point x86 ia-32

我正在研究一个从表达式生成汇编代码的程序。其中一个功能是tan(x),它目前使用以下代码序列(地址在运行时填写):

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;
}

3 个答案:

答案 0 :(得分:9)

让我抛出一些东西:如何使用

fstp st(0);

而不是

fincstp;

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

(你可能猜到我不知道我在说什么。但也许这会给你一个想法?)

答案 1 :(得分:1)

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

对我而言,在执行此代码后,切线仍处于st0。您不应该使用fstp而不是fst吗?

答案 2 :(得分:0)

也许你的FST指令只存储浮动结果,而第二个dword仍然没有被初始化?

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

  FST [dword ptr some_address]

  or 

  FS [qword ptr some_address]