Math, asked by mjkin2710, 1 year ago

Write 80387 alp to find the roots of the quadratic equation. All the possible cases must be considered in calculating the roots

Answers

Answered by lodhiyal16
0

Like printf function in c's asm code

%macro myprintf 1

mov rdi,formatpf

sub rsp,8

movsd xmm0,[%1]

mov rax,1

call printf

add rsp,8

syscall

%endmacro

;--- Printf function

%macro myscanf 1

mov rdi,formatsf

mov rax,0

mov rsi,%1

call scanf

;syscall

%endmacro

;----- Normal System call macro ----

%macro scall 4

mov rax,%1

mov rdi,%2

mov rsi,%3

mov rdx,%4

syscall

%endmacro

;------ Data Section ------

Section .data

ff1: db "%lf +i %lf",10,0 ;format for printf/scanf argument

ff2: db "%lf -i %lf",10,0

formatpi: db "%d",10,0

formatpf: db "%lf",10,0

formatsf: db "%lf",0

four: dq 4 ; 4 for using in formula

two: dq 2

ipart1: db " +i ", 10

ipart2: db " -i " , 10

rmsg: db 0x0A,"Roots are real. Roots: ",0x0A

rmsg_len: equ $-rmsg

imsg: db "Roots are complex. Roots ",0x0A

imsg_len: equ $-imsg

title: db "====== QUadratic Equations ========",0x0A

db "Enter a ,b,c : ",0x0A

title_len: equ $-title

;------ BSS Section -----

section .bss

a: resq 1

b: resq 1

c: resq 1

b2: resq 1 ; b square

fac: resq 1 ; 4ac

delta: resq 1 ; delta value

rdelta: resq 1 ; root of delta

r1: resq 1 ;root 1

r2: resq 1 ;root 2

ta: resq 1 ; 2a

realn: resq 1

img1: resq 1

img2 : resq 1

Section .text

extern printf

extern scanf

global main:

main:

scall 1,1, title,title_len

;;-------- Scanning numbers

myscanf a

myscanf b

myscanf c

;;======== Printing values for checking

;myprintf a

;myprintf b

;myprintf c

;==== Calculating b square

fld qword[b]

fmul qword[b]

fstp qword[b2]

;------- Calculating 4ac

fild qword[four]

fmul qword[a]

fmul qword[c]

fstp qword[fac]

; calculating delta

fld qword[b2]

fsub qword[fac]

fstp qword[delta]

;calcualating 2a

fild qword[two]

fmul qword[a]

fstp qword[ta]

btr qword[delta],63

;bit test set carry if flag is set else reset it

jc IMAGINARY

scall 1,1,rmsg, rmsg_len

;;--------------- REAL ROOTS --------

fld qword[delta]

fsqrt

fstp qword[rdelta]

;----- (-b+squareroot(delta))/2a

fldz

fsub qword[b]

fadd qword[rdelta]

fdiv qword[ta]

fstp qword[r1]

myprintf r1

;----- (-b-squareroot(delta))/2a

fldz

fsub qword[b]

fsub qword[rdelta]

fdiv qword[ta]

fstp qword[r2]

myprintf r2

jmp EXIT

IMAGINARY:

scall 1,1, imsg,imsg_len

fld qword[delta]

fsqrt

fstp qword[rdelta]

fldz

fsub qword[b]

fdiv qword[ta]

fstp qword[realn]

fld qword[rdelta]

fdiv qword[ta]

fstp qword[img1]

;---- printing imag roots

mov rdi,ff1

sub rsp,8

movsd xmm0,[realn]

movsd xmm1,[img1]

mov rax,2

call printf

add rsp,8

mov rdi,ff2

sub rsp,8

movsd xmm0, [realn]

movsd xmm1, [img1]

mov rax,2

call printf

add rsp,8

jmp EXIT

EXIT:

mov rax,60

mov rdi

Similar questions
Math, 7 months ago