Buongiorno, sto cercando di svolgere questo programma, è una traccia d'esame. Il problema è sulla parte dell'overflow...
Io per semplicità ho cercato di gestire i numeri come unsigned...ma il risultato non mi convince...
Qualche parere?
Grazie
Il codice:
#ESAME del 27 Febbraio 2025
#
# Scrivere un programma assembly che legga due numeri interi (positivi, negativi o nulli) da tastiera,
# e stampi la loro somma e la loro differenza.
# L’individuazione della somma e della differenza va fatta utilizzando due funzioni
# (trova_somma, trova_differenza), che ricevono come parametri i due numeri interi e ne ritornano
# la somma e differenza, rispettivamente senza effettuare nessuna verifica di eventuali overflow.
# La chiamata delle due funzioni dovrà rispettare le convenzioni per il salvataggio dei registri.
# Utilizzare le system call RARS (MARS) per l’I/O e la terminazione del main.
# È obbligatorio utilizzare funzioni con scambio dei parametri per individuare somma e differenza.
# Facoltativo: inserire il codice per verificare la presenza di overflow (sia nella somma che nella differenza),
# ed eventualmente segnalarne l’occorrenza.
.global _start
.data
insert1: .asciz "\n Inserisci il primo numero: "
insert2: .asciz "\n Inserisci il secondo numero: "
print_sum: .asciz "\n La somma è: "
print_diff: .asciz "\n La differenza è: "
over_sum: .asciz "\n Per la somma"
over_diff: .asciz "\n Per la differenza"
no_overflow: .asciz " non c'è overflow!"
si_overflow: .asciz " c'è overflow!"
.text
_start:
la a0, insert1
li a7, 4
ecall
li a7, 5
ecall
mv t0, a0
la a0, insert2
li a7, 4
ecall
li a7, 5
ecall
mv t1, a0
jal ra, trova_somma
jal ra, trova_differenza
la a0, print_sum
li a7, 4
ecall
mv a0, s2 # s2: registro per la somma
li a7, 1
ecall
la a0, print_diff
li a7, 4
ecall
mv a0, s3 # s3: registro per la differenza
li a7, 1
ecall
# Punto falcotativo (controllo dell'overflow sia per la somma che per la differenza)
#
# Per la somma
la a0, over_sum
li a7, 4
ecall
bgt s2, t0, no_over
la a0, si_overflow
li a7, 4
ecall
j end_0
no_over:
la a0, no_overflow
li a7, 4
ecall
end_0:
# Per la differenza
la a0, over_diff
li a7, 4
ecall
bltu s3, t1, si_over
la a0, no_overflow
li a7, 4
ecall
j end_1
si_over:
la a0, si_overflow
li a7, 4
ecall
# Fine del Programma
end_1:
li a7, 10
ecall
# Funzione trova_somma
trova_somma:
li s2, 0 # inizializzo la somma
add s2, t0, t1
ret
# Funzione trova_differenza
trova_differenza:
li s3, 0 # inizializzo la differenza
sub s3, t0, t1
ret