2013-10-23 64 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参数加倍,因此请确保您也这样做。