25/08/2026 - Vincenzo.79 ha scritto:
vediamo se ho fatto bene
Per come la vedo io (che sono studente autodidatta come te) ora l'esercizio è più centrato: il main prepara ed invoca la funzione, la funzione fa il suo, ed il main stampa.
Quel che per me ancora si può aggiustare è che continui a non rispettare la convenzione per la quale il parametro in ingresso sia nel registro a0.
Anche il salvataggio di ra sullo stack non lo vedo funzionale. La funzione è foglia... Al suo interno non ci sono quindi altre modifiche ad ra, allora perché spostarlo e rimetterlo quando resta invariato per tutta l'esecuzione?
Alla luce di ciò, proprio perché è una funzione foglia, credo sia superfluo l'uso dei registri sX al suo interno. Usa i tX e quel che succede succede. Se nel main stai usando registri tX ed i relativi valori ti servono che permangano dopo l'invocazione della funzione (ma non è il caso), allora sposta tutto sugli sX. I tX in quel contesto non van bene.
Dopo questi ragionamenti, viene automatico comprendere che la tua preoccupazione per s1 è vana, e per due motivi:
- Perché usare un registro sx in una funzione foglia?
- il valore di ritorno va comunque in a0
Un ultima considerazione sull'algoritmo: tu fai "manualmente" tramite divisione e resto, la conversione in numero binario, ma tu nel registro hai già un numero binario. La divisione per 2 in binario equivale allo shift a destra dei bit.
Io ero arrivato a risolvere l'esercizio con la funzione
count_ones:
# input: a0, numero in cui contare i bit a 1
# output: a0, il conteggio dei bit
# t0, contatore per il ciclo
# t1, memorizza l'ultimo bit a destra dopo lo shift
# t2, contatore per i bit a 1
bez a0, zero, ret_zero # se a0 = 0 ritorno zero
li t0, 32 # Inizializzo il contatore per il ciclo
loop_count:
andi t1, a0, 1 # Ottengo l'ultimo bit a destra
add t2, t2, t1 # Aggiungo l'ultimo bit
addi t0, t0, -1 # decremento il contatore
srli a0, a0, 1 # effettuo lo shift a destra dei bit (divido per 2)
bnez t0, loop_count # ciclo fino a che il contatore non è 0
mv a0, t2 # rendo disponibile il risultato all'esterno della funzione
ret
ret_zero:
li a0, zero
ret
poi ho chiesto all'IA e si può fare molto meglio. Questo algoritmo è ulteriormente ottimizzabile e ne esistono altri (ai quale non sarei mai arrivato da solo) che rendono il ciclo sui bit un macigno al confronto.