0

下面的代码返回值“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。

4

1 回答 1

3

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

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

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

于 2013-10-23T00:38:47.930 回答