簡體   English   中英

NaN意外地出現在與使用x87浮點的程序集混合的C代碼中

[英]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指令存儲一個值,而不會彈出堆棧。 的現有的功能(假設一個function1function2 )推壓的浮點值壓入堆棧,使其返回到它的調用者,調用者應該從堆棧,其可以同時通過使用所述存儲它做彈出它fstp指令代替fst

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM