2016-11-07 36 views
0

"test"という単語を入力し、この単語を反転して出力する( "tset")ようにします。アセンブリMIPS:文字列を逆に印刷する

Cでは、典型的なforループが簡単にこの作業を行うことができます。

for(i='/0'; i>=0; i--) 
printf("%c", str[i]); 

しかし、MIPSでは、少なくともかなり面倒です。

2つのループを作って作ってみました。単に文字列の各文字を読み取り、それを逆印刷するための別のもの:

.data 
str: .space 15 

.text 
.globl main 
main: 

li $v0, 8 #scan a string 
la $a0, str 
la $a1, 15 
syscall 

add $t0, $zero, $zero #counter 

readingloop: 

     lb $a0, str($t0) #read each character 

     beq $a0, '\0', readingexit #make sure the string is not yet over 

     addiu $t0, $t0, 1  #i++ 

j readingloop 
readingexit: 


reversingloop: 
     li $v0, 11  #print a character you have read  
     lb $a0, str($t0) 
     syscall 

     beq $a0, '0', reversingexit #make sure the string 
             #hasn't reached the first letter yet 
     subiu $t0, $t0, 1  #i-- 

j reversingloop 
reversingexit: 

li $v0, 10 
syscall 

そして、それはちょっと正常に動作します。

金田。 MARSでは、カーソルがちょうど右に向かって走り続けるからです。

enter image description here

反転ループカウンタが、我々は上記の言ったforループの「私は> = 0」の事でゼロに成功したときにチェックする必要があるように思えます。

どうすればいいですか?

答えて

0

あなたのコードでは、いくつかの問題があります。

  • reversingloopがプリデクべき$t0(すなわちないの後、前lbsubiu $t0, $t0, 1を行う)を、そうでなければ、あなたNULターミネーターを読むことから始め〜で見つけたreadingloop

  • reversingloopの終了条件は、NULターミネーターは、文字列の末尾に位置していますので、あなたは、NULターミネーターを見つけたことをすべきではない、とあなたはのを開始に向けて反復しています文字列(btw、'\0''0'と誤って入力しました)。終了条件は、$t0が0に等しくなるようにする必要があります。

+0

最初の点は正しいと思います。私のミスに「\ 0」を再入力することで作業しているので、もう1つは私にとって少し奇妙に思えます。 $ t0 == strのとき、どうすれば終了条件を真にすることができますか?私は "枝が等しいならば"派閥が "str"変数を受け取るかどうかわかりません。 – Coursal

+0

私の編集を参照してください。 '$ t0'には完全なアドレスではなくオフセットが含まれていたことを忘れていました。だから、 '$ t0'が0になったら終了するべきです(' $ a0'が0になったときではなく)。あなたはそれが "働いている"と言うかもしれませんが、プログラムが終了し、あなたが配列の範囲外で読んでいたのを見るべきであるときに '$ t0'の値を見てください。 – Michael