Eu utilizo o MARS , em principio isso não afeta o programa.
.data
string1: .asciiz "Numero de caracteres: "
string2: .asciiz ", numero de minusculas: "
string3: .asciiz ", numero de nao representaveis: "
string4: .asciiz
.text
la $a1, string1 #carrega o endereço onde começa a string1
la $a2, string2 #carrega o endereço onde começa a string2
la $a3, string3 #carrega o endereço onde começa a string3
la $t0, string4 #carrega o endereço onde começa a string4
li $v0, 8 #carrega em $v0 o valor imediato de 8 para a syscall
addi $a0, $t0,0 #copia o endereço que está em $t0 para $a0 (obrigatorio pelo syscall)
syscall
li $t2, 97 #carrega em $t2 o valor decimal de 'a'
li $t3, 32 #carrega em $t3 o valor decimal de ' '
li $t4, 0 #inicia registo a 0
li $t5, 0 #inicia registo a 0
li $t6, 0 #inicia registo a 0
li $s0,10 #carrega em $s0 o valor decimal de '\n'
loop:
lb $t1,0($t0) #carrega o valor decimal guardado no endereço $t0
beq $t1,$s0,exit #se o valor for igual a '\n' o programa salta para a label exit
addi $t4,$t4,1 #caso contrario o contador de caracteres aumenta 1
bge $t1,$t2,add_min #se o valor for maior ou igual que 'a' salta para a label add_min
ble $t1,$t3, add_nr #se o valor for menor ou igual a ' ' salta para a label add_nr
addi $t0,$t0,1 #aumenta 1 a $t0 para que o endereço de memoria passe a apontar para os 8 bits seguintes
j loop
add_min:
addi $t5,$t5,1 #aumenta o contador de minuscula em 1
addi $t0,$t0,1 #aumenta 1 a $t0 para que o endereço de memoria passe a apontar para os 8 bits seguintes
j loop #salta para o loop em ordem a continuar o processo até acabar a string
add_nr:
addi $t6,$t6,1 #aumenta o contador de ñ representaveis
addi $t0,$t0,1
j loop
exit:
move $a0,$a1 #nesta secção são carregados os endereços de memoria das strings que aparecem no .data e os
li $v0,4 #valores dos contadores e imprime na tela
syscall #o ultimo syscall com $v0=10 termina o programa
li $v0,1
move $a0, $t4
syscall
move $a0,$a2
li $v0,4
syscall
move $a0,$t5
li $v0,1
syscall
move $a0,$a3
li $v0,4
syscall
li $v0,1
move $a0,$t6
syscall
li $v0,10
syscall
O programa foi feito um bocado à pressa mas funciona bem
Espero ter ajudado
↧