[英]NaNs arise unexpectedly in C code mixed with assembly that uses x87 floating point
我的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(英特爾文檔中的“浮點不確定值”)。
問題中匯編代碼中的fst
指令存儲一個值,而不會彈出堆棧。 的現有的功能(假設一個function1
或function2
)推壓的浮點值壓入堆棧,使其返回到它的調用者,調用者應該從堆棧,其可以同時通過使用所述存儲它做彈出它fstp
指令代替fst
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.