Originariamente inviata da
oregon
Devi modificarlo
Ho capito che devo modificarlo: la mia domanda è...come?
posto il codice in modo tale via sia più chiaro
codice:
# Prende in input un numero intero decimale e stampa la sua rappresentazione binaria
.data
NO_BITS: .word 32 # Numeri di bit
bits: .space 128 # Array dove vengono memorizzati i bit
.globl main
.text
main:
li $v0, 5
syscall
move $t0, $v0 # Prende il numero in $t0
lw $t1, NO_BITS # Contatore dei bit
li $t2, 1 # Una costante 1 che serve come maschera per prendere l'ultimo bit del numero
# tramite AND logico
loop:
and $t3, $t0, $t2 # $t3 = $t0 AND $t2, viene impostato a 1 se l'ultimo bit di $t0 è 1, 0 altrimenti
srl $t0, $t0, 1 # Scarta l'ultimo bit di $t0 per poter considerare gli altri
addi $t1, $t1, -1 # Decrementiamo di uno il contatore
sll $t4, $t1, 2 # Calcoliamo l'indirizzo dove memorizzare il bit nell'array bits
sw $t3, bits($t4) # Memorizziamo il bit
bnez $t1, loop # Se non abbiamo contato 32 bit ripetiamo il procedimento
# Stampa i bit memorizzati nell'array bits
print_bits:
li $t0, 0 # Indirizzo in memoria relativo all'array bits del bit corrente che si vuole stampare
lw $t1, NO_BITS # Numero di bit (32)
sll $t1, $t1, 2 # $t1 = $t1 * 4 = 128 (la prima posizione in memoria fuori dall'array bits)
loop2:
li $v0, 1
lw $a0, bits($t0) # Il bit con indirizzo $t0 viene stampato
syscall
addi $t0, $t0, 4 # Si passa al prossimo indirizzo (sommando quattro visto che si tratta di words)
bne $t0, $t1, loop2 # Se l'indirizzo sta ancora dentro l'array bits significa che non abbiamo finito
exit:
li $v0, 10
syscall