Semplici programmi in Larc Assembly
Esecuzione ciclo
Scriviamo un semplice programma tramite un ciclo chiede all'utente di inserire 5 numeri, uno alla volta, e poi stampa il risultato della somma.
Il programma ciclo_lettura_numeri.s:
li $4 0 # indice iterazione
li $5 1 # costante per incremento
li $6 5 # N° di iterazioni
li $10 0 # accumulatore
# metti in ciclo
slt $7 $4 $6
beqz $7 9
li $1 1 # trap number for Print String
li $2 40 # String is stored at location 40
li $3 20 # maxlength for the string; larger than actual length is OK
syscall # call the Print String trap
# ora leggi intero e aggiungilo all'accumulatore
li $1 4
syscall
add $10 $10 $1
add $4 $4 $5
beqz $0 -11
# stampa il risultato
li $1 1 # trap number for Print String
li $2 60 # String is stored at location 60
li $3 20 # maxlength for the string; larger than actual length is OK
syscall
li $1 2 # "print int" syscall
add $2 $0 $10 # put the product into register 2, which holds the value to be printed
syscall
li $1 0 # trap number for Halt
syscall # halt
@40 # store the following, starting at location 16
"Digita un numero\n
@60
"Output:\n
Salvataggio valori su stack in memoria
Scriviamo un semplice programma tramite un ciclo chiede all'utente di inserire 5 numeri, uno alla volta, e poi stampa la sequenza dei numeri inseriti in ordine inverso. Ad esempio se inseriamo in sequenza i numeri 12 6 9 40 81 poi in output stamperà, dall'ultimo al primo, e quindi: 81 40 9 6 12.
Ii programma ciclo_lettura_uso_pila.s:
li $4 0 # indice iterazione
li $5 1 # costante per incremento
li $6 5 # N° di iterazioni
li $9 100 # costante BASE stack
li $10 100 # puntatore a testa dello stack
# metti in ciclo
slt $7 $4 $6
beqz $7 10
li $1 1 # trap number for Print String
li $2 40 # String is stored at location 40
li $3 20 # maxlength for the string; larger than actual length is OK
syscall # call the Print String trap
# ora leggi intero
li $1 4
syscall
sw $1 $10
add $10 $10 $5 # incrementa di uno il puntatore stack
add $4 $4 $5 # incrementa di uno l'indice
beqz $0 -12
# stampa il risultato
li $1 1 # trap number for Print String
li $2 60 # String is stored at location 60
li $3 20 # maxlength for the string; larger than actual length is OK
syscall
# stampa lo stack
sub $10 $10 $1 # sottrai di 1
slt $7 $10 $9 # confronta puntatore base dello stack con il puntatore alla testa
bnez $7 8
# stampa numero puntato
li $1 2 # "print int" syscall
lw $2 $10 # carica il valore dall'indirizzo di memoria contenuto nerl registro 10
syscall
# stampa nuova linea
li $1 1 # trap number for Print String
li $2 80 # String is stored at location 80
li $3 20 # maxlength for the string; larger than actual length is OK
syscall
beqz $0 -11
li $1 0 # trap number for Halt
syscall # halt
@40 # store the following, starting at location 40
"Digita un numero\n
@60
"Output:\n
@80
"\n
@100 # spazio per stack
Last updated