Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .MODEL SMALL
- .STACK
- .DATA
- a DW 4
- b DW -16 ; [-32768; +32767], b^2 = 1.073.676.289 --> DD [-2.147.483.648; +2.147.483.647]
- c DW 5 ; [-32768; +32767], max(|4ac|) = 4.294.967.296 --> DQ [-9,22E18; +9,22E18]
- ; Conclusioni: la gestione del caso limite è impossibile con l'8086 (vado su 64 bit e la MUL me
- ; ne può gestire al più 32). Assumo i risultati su 32 bit corretti.
- REA DB "Soluzioni reali.", 0DH, 0AH, "$"
- CPX DB "Soluzioni complesse.", 0DH, 0AH, "$"
- .CODE
- .STARTUP
- MOV AX, b
- IMUL AX ; b^2, risultato su DX,AX.
- PUSH AX ; AX e DX mi servono per le successive moltiplicazioni -> uso lo stack
- PUSH DX
- MOV AX, c
- IMUL a ; DX,AX = ac
- ; Ora devo moltiplicare per 4 un numero su 32 bit
- MOV CX, 2 ; 4 = 2^2, 2 operazioni di shift
- MUL4: MOV BX, 0 ; Variabile temporanea per salvare il CF (vedi sotto)
- SHL AX, 1 ; Shift a sinistra della parte bassa, MSB nel CF
- ADC BX, 0 ; In BX ho il CF che col successivo shift perderei
- SHL DX, 1 ; Shift a sinistra della parte alta
- ADD DX, BX ; Sommo solo CF a DX shiftato a sinistra di 1
- LOOP MUL4 ; Ripeto l'operazione due volte. In DX,AX alla fine ho 4ac
- POP CX ; DX della prima moltiplicazione
- POP BX ; AX della prima moltiplicazione
- CMP CX, DX ; Confronto fra le parti alte
- JE LOW_PARTS ; Se uguali, non posso dire niente
- JG SOLUT_REA ; Se CX è più grande, b^2 > 4ac. 2 soluzioni reali
- JL SOLUT_CPX ; Se CX è più piccolo b^2 < 4ac. Soluzioni complesse coniugate.
- LOW_PARTS: CMP BX, AX ; Confronto fra le parti basse
- JGE SOLUT_REA ; Se BX è maggiore o uguale di AX, b^2 >= 4ac. 1/2 soluzioni reali.
- JL SOLUT_CPX ; Se BX è minore di AX, b^2 < 4ac. Soluzioni complesse coniugate.
- SOLUT_REA: LEA DX, REA ; Output a schermo del risultato.
- JMP STAMPA
- SOLUT_CPX: LEA DX, CPX
- STAMPA: MOV AH, 09D
- INT 21H
- .EXIT
- END
Advertisement
Add Comment
Please, Sign In to add comment