2017-01-31 4 views
2

Мне нужно написать программу для подсчета количества гласных в строке в MIPS. Мой текущий код дает мне ошибку памяти за пределами границ в QtSPim. Я на начальном уровне в MIPS, поэтому любая помощь будет оценена. код до сих пор:Определение количества гласных в заданной строке в MIPS

.data 
    str: .space 20 
my_chars: .space 20 
vow1: .byte 'a' 
vow2: .byte 'e' 
vow3: .byte 'i' 
vow4: .byte 'o' 
vow5: .byte 'u' 
.text 
main: 
li $s0,0     #initilaze loop var1 
li $t0,20     #initialize loop var2 
li $s1,0     #initialize counter 
la $t1, my_chars    # base address of array 
li $a1,20      #max input to be read 
li $a0,8 
syscall 
loop: 
beq $s0, $t0, exit 
la $t2, str     #string into t2 
lb $v0, 0($t2)     #access first index 
lb $t9, vow1 
beq $v0, $t9, then    #comparing to a 
then: 
addi $s1, $s1, 1 

lb $t8, vow2 
beq $v0, $t8, then1    #comparing to e 
then1: 
addi $s1, $s1, 1 
lb $t7, vow3 
beq $v0, $t7, then2    #comparing to i 
then2: 
addi $s1, $s1, 1 
lb $t6, vow4 
beq $v0, $t6, then3    #comparing to o 
then3: 
addi $s1, $s1, 1 
lb $t5, vow5 
beq $v0, $t5, then4    #comparing to u 
then4: 
addi $s1, $s1, 1 

addi $t1, $t1,1    #increment base address 
addi $s0, $s0,1    #increment loop variable 
j L1 
syscall 
+0

Ваш вопрос должен как минимум включать точное сообщение об ошибке , и строка кода, к которой относится ошибка. – Michael

+0

Он представляет сообщение за пределами границ, другое сообщение, которое я могу видеть –

+0

Как я уже сказал, вы должны отправить ** точное **, ** полное ** сообщение и указать строку кода, что сообщение об ошибке относится к. – Michael

ответ

0

Потому что ваш код был размещен недостающие этикетки и т.д. Я не мог запустить его искать ошибки во время выполнения.

От визуального осмотра, прочитанного из кода ввода пользователя, было несколько проблем. li $a0,8 должно быть li $v0,8 [номер в режиме ожидания для чтения строки]. $a0 должен содержать адрес буфера для чтения. В вашем коде это 8 и [возможно] недействительный адрес. Итак, вы, вероятно, захотите что-то вроде la $a0,my_chars или la $a0,str. Один из них должен быть входным буфером, а другой - лишним.

Поскольку я пытался добавить ярлыки [на основе образованных догадок], я понял, что ваша программа могла бы/была бы намного проще, если гласные были в массиве, поэтому я реорганизовал код.

Я также изменил завершение цикла, чтобы искать EOS (0x00) вместо уменьшения числа, что могло быть другим потенциальным источником проблемы вне границ. Это также уменьшает количество регистров, необходимых (т.е. снижает сложность)

Я добавил недостающие шаблонные/системные вызовы [простите пожалуйста безвозмездную ыборку стиля]:

.data 
vowel:  .asciiz  "aeiou" 
msg_prompt: .asciiz  "Enter string: " 
msg_out: .asciiz  "Number of vowels is: " 
msg_nl:  .asciiz  "\n" 
str:  .space  80 

    .text 
    .globl main 
main: 
    # print user prompt 
    li  $v0,4 
    la  $a0,msg_prompt 
    syscall 

    # get string to scan 
    li  $v0,8 
    la  $a0,str 
    li  $a1,80 
    syscall 

    li  $s2,0     # initialize vowel count 
    la  $s0,str     # point to string 

# registers: 
# s0 -- pointer to string character 
# s1 -- pointer to vowel character 
# s2 -- count of vowels 
# 
# t0 -- current string character 
# t1 -- current vowel character 
string_loop: 
    lb  $t0,0($s0)    # get string char 
    addiu $s0,$s0,1    # point to next string char 
    beqz $t0,string_done   # at end of string? if yes, fly 

    la  $s1,vowel    # point to vowels 

vowel_loop: 
    lb  $t1,0($s1)    # get the vowel we wish to test for 
    beqz $t1,string_loop   # any more vowels? if not, fly 
    addiu $s1,$s1,1    # point to next vowel 
    bne  $t0,$t1,vowel_loop  # is string char a vowel? -- if no, loop 
    addi $s2,$s2,1    # yes, increment vowel count 
    j  string_loop    # do next string char 

string_done: 
    # print count message 
    li  $v0,4 
    la  $a0,msg_out 
    syscall 

    # print vowel count 
    li  $v0,1 
    move $a0,$s2 
    syscall 

    # print a newline 
    li  $v0,4 
    la  $a0,msg_nl 
    syscall 

    # exit program 
    li  $v0,10 
    syscall 
Смежные вопросы