我的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
指令存储一个值而不弹出堆栈。假设先前的函数之一(function1
或 function2
)将一个浮点值压入堆栈以将其返回给其调用者,则调用者应将其从堆栈中弹出,这可以在存储时使用 fstp
指令而不是 fst
来完成。
关于c - NaN 在与使用 x87 浮点的汇编混合的 C 代码中意外出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48252632/