2013-10-23 169 views
0

下面的代碼返回的「448070899」取代SQRT的值(4),它是2FSQRT沒有返回正確的值

segment .data 

heeder: db "%d", 0 



x dd 16 
y dd 4 
segment .bss 
array resd 10 

sum resd 1 

SECTION .text 
global _main 

extern _scanf 
extern _printf 

_main: 

push ebp 
mov ebp, esp 

fldz 

    fld dword[y] 
fsqrt 
fst dword[sum] 
mov eax, [sum] 


push eax 
push heeder 
call _printf 
add esp, 8 
pop ebp 
ret 

其不返回正確的數.......數它的返回值是448070899.這是不正確的,正確的應該是2 ..因爲4的平方根是2。

+0

由於您正在編寫程序集,因此您應該找出發現問題的最佳方法 - 並在此過程中學習捆綁包!我建議你調試代碼,看看FPU內部發生了什麼:如果它按照它應該做的(用平方根替換棧頂值),那麼你就會知道FPU運行正常。如果最初的TOS值 - 輸入值 - 結果不是您所期望的,那麼您必須檢查前面的步驟以找出原因。我最後一次聽說x86 FPU沒有正確執行,是在九十年代的前半期 –

回答

3

由於您顯然期待整數結果(由於格式爲%d),因此應使用存儲整數的指令FISTP。同樣,您的輸入y也是一個整數,所以請使用FILD加載它。

另請注意,您應該清理FPU堆棧。如果您刪除當前未使用的FLDZ,則FISTP將執行此項工作。

如果您曾經切換到浮點結果,請記住C會自動將printf參數加倍,因此請確保您也這樣做。