Assembly FSQRT未返回正确的值

Assembly FSQRT未返回正确的值,assembly,nasm,sqrt,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

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

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

还要注意,您应该清理FPU堆栈。如果删除当前未使用的
FLDZ
,则
FISTP
将执行此操作


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

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

还要注意,您应该清理FPU堆栈。如果删除当前未使用的
FLDZ
,则
FISTP
将执行此操作


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

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

还要注意,您应该清理FPU堆栈。如果删除当前未使用的
FLDZ
,则
FISTP
将执行此操作


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

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

还要注意,您应该清理FPU堆栈。如果删除当前未使用的
FLDZ
,则
FISTP
将执行此操作


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

既然您正在编写汇编,那么您应该能够很好地找出错误所在,并在此过程中学习一个包!我建议您调试代码,看看FPU内部发生了什么:如果它做了它应该做的事情(用它的平方根替换堆栈顶部的值),那么您将知道FPU工作正常。如果初始TOS值(输入值)不是您预期的值,那么您必须检查前面的步骤以找到原因。上一次我听说x86 FPU不能正确运行是在90年代上半叶,而您正在编写汇编程序,您应该有机会找出错误所在,并在此过程中学习一个捆绑包!我建议您调试代码,看看FPU内部发生了什么:如果它做了它应该做的事情(用它的平方根替换堆栈顶部的值),那么您将知道FPU工作正常。如果初始TOS值(输入值)不是您预期的值,那么您必须检查前面的步骤以找到原因。上一次我听说x86 FPU不能正确运行是在90年代上半叶,而您正在编写汇编程序,您应该有机会找出错误所在,并在此过程中学习一个捆绑包!我建议您调试代码,看看FPU内部发生了什么:如果它做了它应该做的事情(用它的平方根替换堆栈顶部的值),那么您将知道FPU工作正常。如果初始TOS值(输入值)不是您预期的值,那么您必须检查前面的步骤以找到原因。上一次我听说x86 FPU不能正确运行是在90年代上半叶,而您正在编写汇编程序,您应该有机会找出错误所在,并在此过程中学习一个捆绑包!我建议您调试代码,看看FPU内部发生了什么:如果它做了它应该做的事情(用它的平方根替换堆栈顶部的值),那么您将知道FPU工作正常。如果初始TOS值(输入值)不是您预期的值,那么您必须检查前面的步骤以找到原因。我最后一次听说x86 FPU不能正确运行是在上世纪90年代上半叶和90年代中期