Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- EXTRN ExitProcess: PROC
- .DATA
- ;Do edycji
- Wieksze BYTE "Istnieja 2 rozwiazania", 13,10,0
- Rowne BYTE "Jest 1 rozwiazanie",13,10,0
- Ujemne BYTE "Brak rozwiazan",13,10,0
- ErrA BYTE "A musi byc dodatnie",13,10,0
- parA dq 6.0
- parB dq 7.0
- parC dq 8.0
- l4 dq 4.0
- l2 dq 2.0
- delta dq 0.0
- x1 dq 0.0
- x2 dq 0.0
- .CODE
- Start PROC
- xor rax,rax
- xor rcx,rcx
- ;Delta= b^2-4ac
- cmp parA,0
- je ErrA
- FLD parB
- FMUL parB
- FLD parA ; parA ląduje na st(0)/ parB przechodzi na st(1)
- FMUL parC ;a*c i załadowanie na st(0)
- FMUL l4 ;pomnożenie 4*a*c i wrzucnie na st(0)
- FSUBP st(1),st(0) ;odjęcie b^2 (st1) od 4AC (st0)
- FSTP delta ;kopiowanie wyniku działania do zmiennej delta
- cmp delta,0 ;sprawdzenie dodatności delty
- jg WiekszeOdZera ;jesli wieksze skok do etykiety
- je RowneZero ;jezli rowne zero skok do etykiety
- lea rcx,Ujemne
- jmp FuncEnd
- RowneZero: ;jedno rozwiazanie
- JednoRozwiazanie:
- lea rcx,Rowne
- ;x1=-b/2a
- FLD parB ;załadowanie b na st(0)
- fchs ;zmiana znaku
- FLD parA
- FMUL l2
- FDIVP st(1),st(0) ;odejmowanie
- FSTP x1 ;załadowanie wyniku do zmiennej x1
- FSTSW ax ;przeniesienie wyniku do ax
- SAHF
- jmp FuncEnd
- WiekszeOdZera:
- ;równanie ma dwa rozwiązania
- lea rcx,Wieksze
- ;obliczenie x1
- FLD parB
- FCHS ;-b
- FLD Delta
- FSQRT ;sqrt(delta)
- FSUBP st(1),st(0) ;odejmowanie
- FLD parA
- FMUL l2
- FDIVP st(1),st(0) ;dzielenie st(1) przez st(0)
- FSTP x1
- ;obliczenie x2
- FLD parB
- FCHS ;-b
- FLD Delta
- FSQRT ;sqrt(delta)
- FADDP st(1),st(0) ;odejmowanie
- FLD parA
- FMUL l2
- FDIVP st(1),st(0) ;dzielenie st(1) przez st(0)
- FSTP x2
- ;obliczenie wyniku
- FSTSW ax ;załadowanie stanu statusu koprocesora do msc w pamieci lub rejestru
- SAHF ;ładuje rejestr AH do rejestru Flag
- jmp FuncEnd
- ;A musi być większe od 0
- lea rcx,ErrA
- FuncEnd:
- call ExitProcess
- Start ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement