Код MIPS, который читает количество строчных букв

Мне нужно написать программу, которая читает строку от пользователя и выводит количество строчных букв в строке. Это то что я написал

.data
msg1 : .word 0:24
.text
.globl main

main :
addu $s0 , $0 , $ra         #save the return address
li $v0 , 8          #syscall for read str
la $a0 , msg1           #load address of msg1 to store string
li $a1 , 100            #msg1 is 100 bytes
syscall

add $t6, $t6, $0

compare :
lb $t0 , 0($a0)         #load the character into $t0
beq $t0, $0, endloop
li $t1 , 'a'            #get value of 'a'
blt $t0 , $t1 , nomodify    #do nothing if letter is less than 'a'
li $t1 , 'z'            #get value of 'z'
bgt $t0 , $t1 , nomodify    #do nothing if letter is great than 'z'
addi $t6, $t6, 1        #add one to the character count
addi $a0, $a0, 1        #move to next character
beq $0,$0,compare       #branch to compare 

nomodify :
addi $a0, $a0, 1        #next character
j compare

endloop :
addu $a0, $0, $t6       
li $v0 , 1          #syscall for print int
syscall
addu $ra , $s0 , $0     #restore return address
jr $ra  

Однако, когда он запускается, он завершается с ошибками, и я не совсем уверен, что я делаю неправильно. Любые предложения / советы очень ценятся! Заранее спасибо.

1 ответ

Решение

Там есть exit syscall доступен в MARS/SPIM для выхода из приложения. Так что вместо завершения вашей программы это:

addu $ra , $s0 , $0     #restore return address
jr $ra 

вы должны использовать:

li $v0, 10    
syscall    # syscall 10 = exit

jr $ra просто возвращается к тому коду, который вызывал ваш main рутина. В MARS это кажется "никуда", то есть когда ваш main начинает работать $ra это 0.
В SPIM есть некоторый код установки, который вызывает ваш main, а затем выполняет системный вызов 10, если и когда вы вернетесь. Так что в SPIM ваш код будет работать как есть.

Другие вопросы по тегам