NASM 80387协处理器printf printing -nan

时间:2018-04-14 14:40:38

标签: assembly nasm x86-64

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

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

1 个答案:

答案 0 :(得分:1)

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