2017-01-31 7 views
0

私のMIPSコードに問題があります...キーボードで渡された文字列の出現を比較文字でチェックします。私はスタック内の文字列(スタック-255の位置)と.dataセクション内の配列を使用して、そのオカレンスを格納します。基本的な考え方は、スタックから文字を1つ1つループ(lb $ t1、($ a0)t1 =文字のASCIIコード - a0 =関数で渡されたスタック)にロードし、読み込まれた文字を減算する97(97 = a)をスタックから取り出し、配列のインデックスを取得し、別のループを使用して、出現回数をカウントし、これを前に計算したインデックスの下に保存します。明らかに、配列には104個の位置があります(26個の文字* 4は出現回数を節約するためです)。問題は、私が配列の位置のインデックスを見つけたときに、sw $ - 、myArray($ - )Marsで発生した位置を保存すると ランタイム例外が0x0040007c:ストアアドレスが整列していない単語境界0x10010087 .dataセクションに.alignを追加しようとしましたが、解決策を見つけられませんでした。エラー "ストアアドレスがワード境界に揃えられていません"

これは私のコードです:

analizza_stringa: (function) 

while_string: 

# load a byte from the stack 
lb $t0, ($a0) 

#check end string 
beq $t0, $zero, end 

#check a line feed 
beq $t0, 10, end 

    #array index 
    subi $t3, $t0, 97 

    #Multiply by 4 (I would save number) 
    mul $t4, $t3, 4 

    while_occorrenza: 
     #like before 
     beq $t1, 10, continue 

     #load a letter like before 
     lb $t1,($a0) 

     #Check the occurrences 
     bne $t1, $t0, continue2 

     #add 1 at the occurrences 
     addi $t5, $t5, 1 

     continue2: 

     #add 1 for the pointer at the string 
     addi $a0, $a0, 1 

     #Repeat 
     j while_occorrenza 

    continue: 

    #Save the number under the index calculated before 
    sw $t5, myArray($t4) 

    #counter=0 for another loop 
    li $t3, 0 

#next character 
addi $a0, $a0, 1 

# repeat the first loop 
j while_string 

end: 
jr $ra 

答えて

0

あなたはメモリ内の単語にアクセスしたい場合は、アドレスがワード境界で整列(4の倍数)でなければなりません。

$t4には4の倍数が含まれていると仮定すると、myArrayはワードアライメントされていません。これを修正するには、データセクションのmyArrayより前の行に.align 2を追加します。

+0

マイケルありがとうございます!今度は、配列内に私の発生を保存することができます。ありがとう、ありがとう! – Marco

関連する問題