NASM 80387 协处理器 printf 打印 -nan

NASM 80387 coprocessor printf printing -nan

这是 nasm 程序,我试图在其中计算二次方程的根。我正在使用 printf 和 scanf。在所有计算之后,当我打印存储在变量 root1 和 root2 中的两个根时,正在打印的两个根的值都是 -nan。程序中可能有什么问题。 'write' 和 'exit' 宏正在从其他文件中包含。

extern printf
extern scanf

section .data
msg1 db "enter a: "
len1 equ $-msg1
msg2 db "enter b: "
len2 equ $-msg2
msg3 db "enter c: "
len3 equ $-msg3

frmt1 db "%lf",0
frmt2 db "the numbers are :- ",10,"a = %lf",10,"b = %lf",10,"c = %lf",10,0
frmt3 db "root1 = %lf",10,0
frmt4 db "root2 = %lf",10,0

num4 dq 4
num2 dq 2

section .bss
a resq 1
b resq 1
c resq 1
del resq 1
sdel resq 1
root1 resq 1
root2 resq 1

section .code
global main
main:
;create stack frame
push rbp
mov rbp,rsp

write msg1,len1
mov rdi,frmt1
mov rsi,a
call scanf

write msg2,len2
mov rdi,frmt1
mov rsi,b
call scanf

write msg3,len3
mov rdi,frmt1
mov rsi,c
call scanf

mov rdi,frmt2
movq xmm0,[a]
movq xmm1,[b]
movq xmm2,[c]
mov rax,3
call printf

finit   ;initilaize coprocessor
fld qword[b]
fmul qword[b]
fld qword[a]
fmul qword[c]
fimul word[num4]
fsub
fst qword[del]
fsqrt
fstp qword[sdel]
fld qword[b]
fchs
fadd qword[sdel]
fild word[num2]
fmul qword[a]
fdiv 
fstp qword[root1]
fld qword[b]
fchs
fsub qword[sdel]
fld qword[a]
fimul word[num2]
fdiv
fstp qword[root2]

mov rdi,frmt3
movq xmm0,[root1]
mov rax,1
call printf

mov rdi,frmt4
movq xmm0,[root2]
mov rax,1
call printf



;destroy stack frame
mov rsp,rbp
pop rsp
exit

在这种情况下,我不处理虚根的条件。因此,我将 root1 和 root2 的值设为 -nan。如果我输入 a、b、c 的值使得 b^2-4ac >= 0,答案就很好。