2017-01-31 5 views
2

Je dois écrire un programme pour compter le nombre de voyelles dans une chaîne dans MIPS. Mon code actuel me donne une erreur de mémoire hors limites dans QtSPim. Je suis au niveau débutant en MIPS, donc toute aide serait appréciée. jusqu'à présent code:Trouver le nombre de voyelles dans une chaîne donnée dans 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

Votre question doit au minimum inclure le message d'erreur exact et la ligne de code à laquelle l'erreur fait référence. – Michael

+0

Il présente un message de mémoire hors limites, aucun autre message que je peux voir –

+0

Comme je l'ai dit, vous devriez poster le message ** exact **, ** complet **, et indiquer la ligne de code que le message d'erreur fait référence à. – Michael

Répondre

0

Parce que votre code affiché a des étiquettes manquantes, etc. Je ne pouvais pas courir pour chercher l'erreur d'exécution.

À partir de l'inspection visuelle, le code d'entrée lu par l'utilisateur présentait quelques problèmes. li $a0,8 doit être li $v0,8 [le numéro de syscall pour lire une chaîne]. $a0 doit contenir l'adresse du tampon à lire. Dans votre code, c'était 8 et [probablement] pas une adresse valide. Donc, vous voudriez probablement quelque chose comme la $a0,my_chars ou la $a0,str. L'un d'eux devrait être le tampon d'entrée et l'autre semble inutile. Alors que j'essayais d'ajouter des étiquettes [basées sur des devinettes éclairées], j'ai réalisé que votre programme pourrait/serait beaucoup plus simple si les voyelles étaient dans un tableau, donc j'ai refactorisé le code.

J'ai également modifié la terminaison de boucle pour rechercher EOS (0x00) au lieu de décrémenter un nombre, ce qui peut avoir été une autre source potentielle d'un problème de dépassement de limites. Cela réduit également le nombre de registres nécessaires (c.-à-réduit la complexité)

J'ai ajouté les boilerplate/syscalls manquants [s'il vous plaît pardonnez le nettoyage de style gratuit]:

.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