64 lines
2.1 KiB
NASM
64 lines
2.1 KiB
NASM
.data
|
|
wVet: .space 50
|
|
wRes: .space 1
|
|
charact: .byte 'a'
|
|
mex_prompt: .asciiz "Inserire caratteri\n"
|
|
mex_occ: .asciiz "Occorrenze: "
|
|
|
|
.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 puntatore
|
|
la $t0, wVet # punta a inizio vettore
|
|
add $t1, $t0, $t5 # indirizzo finale
|
|
lb $t2, charact
|
|
|
|
move $t4, $0
|
|
|
|
conta_occorrenze:
|
|
lb $t3, ($t0)
|
|
bne $t3, $t2, prox_chr # salto se non è un minimo
|
|
addi $t4, $t4, 1 # memorizzo il nuovo minimo
|
|
prox_chr:
|
|
add $t0, $t0, 1 # incremento puntatore
|
|
bne $t0, $t1, conta_occorrenze # smetto di saltare quando ho iterato su tutti i caratteri
|
|
|
|
# stampo ultimo messaggio
|
|
la $a0, mex_occ
|
|
li $v0, 4 # id della syscall print_str
|
|
syscall
|
|
|
|
move $a0, $t4
|
|
li $v0, 1
|
|
syscall
|
|
|
|
|
|
fine:
|
|
li $v0, 10
|
|
syscall
|
|
.end main |