Assembly FSQRT未返回正确的值
下面的代码返回值“448070899”,而不是sqrt(4),它是2Assembly 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
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年代中期