64 lines
2.4 KiB
NASM
64 lines
2.4 KiB
NASM
.data
|
|
wVet: .space 50
|
|
wRes: .space 1
|
|
mex_prompt: .asciiz "Inserire caratteri\n"
|
|
mex_result: .asciiz "\nValore minimo: "
|
|
|
|
.text
|
|
.globl main
|
|
.ent main
|
|
|
|
main:
|
|
la $t0, wVet # punta a inizio vettore
|
|
li $t1, 0 # inizializzo contatore
|
|
|
|
# stampo primo messaggi
|
|
la $a0, mex_prompt
|
|
li $v0, 4 # id della syscall print_str
|
|
syscall
|
|
|
|
# lettura stringa. a quanto pare posso solo fare una read_chr
|
|
ciclo_read:
|
|
# syscall read
|
|
li $v0, 12
|
|
syscall # il risultato è in v0
|
|
sb $v0, ($t0)
|
|
add $t0, $t0, 1 # incremento puntatore
|
|
beq $v0, '\n', fine_lettura # smetto di saltare quando ho raggiunto un newline
|
|
add $t1, $t1, 1 # incremento contatore (sapendo che non è un \n)
|
|
beq $t1, 50, fine_lettura # controllo di non uscire dal buffer
|
|
b ciclo_read
|
|
|
|
fine_lettura:
|
|
move $t5, $t1 # salvo in $t5 la lunghezza della stringa
|
|
|
|
# resetto contatore e puntatore
|
|
la $t0, wVet # punta a inizio vettore
|
|
li $t1, 0 # inizializzo contatore
|
|
|
|
lb $t2, ($t0) # memorizzo il valore minimo dentro t2, e inizializzo con primo carattere
|
|
|
|
cerca_min:
|
|
lb $t3, ($t0)
|
|
ble $t3, 0x20, prox_chr # salto se è un carattere speciale
|
|
bgt $t3, $t2, prox_chr # salto se non è un minimo
|
|
move $t2, $t3 # memorizzo il nuovo minimo
|
|
prox_chr:
|
|
add $t0, $t0, 1 # incremento puntatore
|
|
add $t1, $t1, 1 # incremento contatore
|
|
bne $t1, $t5, cerca_min # smetto di saltare quando ho iterato su tutti i caratteri
|
|
|
|
# stampo messaggio
|
|
la $a0, mex_result
|
|
li $v0, 4 # id della syscall mex_result
|
|
syscall
|
|
|
|
# stampo carattere minimo
|
|
move $a0, $t2
|
|
li $v0, 11
|
|
syscall
|
|
|
|
# termino programma
|
|
li $v0, 10
|
|
syscall
|
|
.end main |