.data
indirizzo_str:
.asciiz "l'indirizzo e' "
carattere_str:
.asciiz "il carattere e' "
stringa:
.asciiz "ciao"
.text
# prende un indirizzo in $a0 e lo stampa usando la syscall print_int di SPIM
stampa_indirizzo: addi $sp, $sp, -4
sw $ra, 0($sp)
# copia $a0 in $t0 perche' dobbiamo passare un parametro
# alla syscall quindi modificheremo $a0
move $t0, $a0
# carica in $a0 l'indirizzo di partenza della stringa
# indirizzo_str
la $a0, indirizzo_str
# carica in $v0, 4, cioe' print_string
li $v0, 4
syscall
# un puntatore e' un intero, quindi dobbiamo usare
# print_int che e' 1
li $v0, 1
# carica in $a0 l'indirizzo del puntatore da stampare
move $a0, $t0
syscall
# ora dobbiamo stampare il carattere "\n", la syscall
# print_chr e' 11
li $v0, 11
# carica in $a0 "\n" (che in decimale e' 10)
li $a0, 10
syscall
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
stampa_carattere: addi $sp, $sp, -4
sw $ra, 0($sp)
# copia $a0 in $a1
move $a1, $t0
# carica in $a0 l'indirizzo di partenza della stringa
# carattere_str
la $a0, carattere_str
# carica in $v0, 4, cioe' print_string
li $v0, 4
syscall
# carica il carattere puntato dal puntatore $t0
lb $t1, 0($t0)
# dobbiamo stampare un carattere, print_chr e' 11
li $v0, 11
# copia in $a0 il carattere da stampare
move $a0, $t1
syscall
# ora dobbiamo stampare il carattere "\n", la syscall
# print_chr e' 11
li $v0, 11
# carica in $a0 "\n" (che in decimale e' 10)
li $a0, 10
syscall
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
funzione: addi $sp, $sp, -4
sw $ra, 0($sp)
# carica l'indirizzo di partenza della stringa in $s0.
# la significa load address, quindi metti in $s0 l'indirizzo in
# cui si trova "stringa". Una stringa in assembly e'
# rappresentata dall'insieme di caratteri contenuti tra il suo
# indirizzo di partenza e il primo carattere 0 trovato scorrendo
# la stringa.
la $s0, stringa
# stampa il puntatore $s0 e il carattere che esso punta
move $a0, $s0
jal stampa_indirizzo
move $a0, $s0
jal stampa_carattere
# stampa il secondo carattere
addi $s0, $s0, 1
move $a0, $s0
jal stampa_indirizzo
move $a0, $s0
jal stampa_carattere
# stampa il terzo carattere
addi $s0, $s0, 1
move $a0, $s0
jal stampa_indirizzo
move $a0, $s0
jal stampa_carattere
# stampa il quarto carattere
addi $s0, $s0, 1
move $a0, $s0
jal stampa_indirizzo
move $a0, $s0
jal stampa_carattere
# stampa il quinto carattere
addi $s0, $s0, 1
move $a0, $s0
jal stampa_indirizzo
move $a0, $s0
jal stampa_carattere
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
main: addi $sp, $sp, -4
sw $ra, 0($sp)
jal funzione
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra