FSQRT没有返回正确的值

时间:2013-10-23 00:26:14

标签: assembly nasm sqrt

以下代码返回值“448070899”而不是sqrt(4),即2

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。

1 个答案:

答案 0 :(得分:3)

由于您显然期望整数结果(由于%d格式),因此您应该使用存储整数的FISTP指令。同样,您的输入y也是一个整数,因此请使用FILD加载它。

另请注意,您应该清理FPU堆栈。如果您删除当前未使用的FLDZ,那么FISTP将完成此任务。

如果您曾切换到浮点结果,请记住C会自动将printf个参数提升为double,因此请确保您也这样做。