c - NaN 在与使用 x87 浮点的汇编混合的 C 代码中意外出现

标签 c function x86 sse clock

我的C代码如下。它调用汇编函数。

clock_t t = clock();
asmfunction(input);
t = clock() - t;
printf("%.5f\n", ((float)t)/CLOCKS_PER_SEC);

我使用汇编 x86-32+SSE 作为 asmfunction

我不明白为什么第二个 clock() 调用返回 nan。

我的汇编代码是一个使程序调用的循环。我注意到,如果迭代超过六次,时钟函数的第二次调用将返回 NaN。否则可以正常工作。

这是我的汇编代码的核心:

do_while:
    push dword [eax+n]
    push eax
    push ecx
    push dword [eax+p]
    call function1
    add esp,16

    push dword [eax+n]
    push eax
    push ecx
    call function2
    add esp,12      

    fst qword[res]

    push dword [eax+n]
    push eax
    push ecx
    call function3  ;function3 returns a double precision floating 
                    ;point value
    add esp,12 
    movsd xmm1,[res] ;xmm1=res

    comisd xmm1,[eax+ex] ; eax+ex is a quadword
    ja do_while

为什么clock调用的结果是NaN?

最佳答案

x87 FPU(浮点单元)堆栈只有八个元素。如果例程没有弹出它压入的所有元素,则堆栈将随着例程的重复使用而快速溢出。一旦堆栈溢出,浮点运算将产生 NaN(Intel 文档中的“浮点不定值”)。

问题中汇编代码中的fst指令存储一个值而不弹出堆栈。假设先前的函数之一(function1function2)将一个浮点值压入堆栈以将其返回给其调用者,则调用者应将其从堆栈中弹出,这可以在存储时使用 fstp 指令而不是 fst 来完成。

关于c - NaN 在与使用 x87 浮点的汇编混合的 C 代码中意外出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48252632/

相关文章:

c - 在 C 语言中,在一个小函数中声明并初始化一个变量或者只返回一个响应

c - 带有指向函数指针的结构

c++ - 现代x86硬件能否不将单个字节存储到内存中?

c - 这段代码用什么来确定数组的大小?

c - 函数返回类型的名称作为用户定义数据类型的名称

c - 访问 struct 中的 char 数组显示越界错误

使用管道时子进程退出代码!= 0

python - OpenCV中的img.copy(),img.shape()

javascript - 函数是真值?

c++ - 计算机程序运行时会发生什么?