Di seguito posto una traccia d'esame che sono riuscito a svolgere però senza usare la funzione.
Ora sto provando con la funzione ma non riesco ad implementarla come dovrebbe essere...posto la traccia ed il codice
NB: mi sono bloccato proprio nell'uso della funzione alla quale non riesco a capire bene se passare solo il contatore degli 1...
##################################################################################################
# Scrivere un programma che legga un numero da tastiera e ne stampi il numero di 1 contenuto
# nella sua rappresentazione binaria utilizzando una funzione (count_ones) che riceve in input
# il puntatore all'intero e ritorna il conteggio degli "1", che sarà successivamente stampato nel
# main. La chiamata della funzione dovrà rispettare le convenzioni per lo scambio dei parametri
# - ritorno dei risultati e per il salvataggio dei registri.
# ESEMPIO: se il numero inserito è 17892 (in binario --> 0100010111100100), in numero di
# "1" dovrà essere 7.
###################################################################################################
.globl _main
.data
input_num: .asciz " Dammi un numero (-2^31 <= x < 2^31): "
output_num: .asciz " Il numero in binario: "
msg_count: .asciz "\n Il numero di 1 nella rappresentazione binaria è "
resto: .asciz " Il resto è "
divisione: .asciz " La divisione è "
.text
_main:
la a0, input_num
li a7, 4
ecall
li a7, 5
ecall
mv t1, a0
li t2, 2 # Valore per la divisione
# Calcolo il resto
rem t3, t1, t2 # Calcolo il resto e lo salvo nel registro t3
print:
la a0, resto
li a7, 4
ecall
mv a0, t3
li a7, 1
ecall
# Calcolo la divisione
div t1, t1, t2
print:
la a0, divisione
li a7, 4
ecall
mv a0, t1
li a7, 1
ecall
jal ra, count_ones
la a0, msg_count
li a7, 4
ecall
mv a0, t4
li a7, 1
ecall
end:
# Fine del programma
li a7, 10
ecall
# FUNZIONE DA COMPLETARE
count_ones:
addi, sp, sp, -8
lw ra, 0(sp)
lw s0, 8(sp)
addi s0, s0, 1
mv ra, s0
sw s0, 8(sp)
sw ra, 0(sp)
addi, sp, sp, 16
ret