以下代码返回值“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。
答案 0 :(得分:3)
由于您显然期望整数结果(由于%d
格式),因此您应该使用存储整数的FISTP
指令。同样,您的输入y
也是一个整数,因此请使用FILD
加载它。
另请注意,您应该清理FPU堆栈。如果您删除当前未使用的FLDZ
,那么FISTP
将完成此任务。
如果您曾切换到浮点结果,请记住C会自动将printf
个参数提升为double,因此请确保您也这样做。