"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では、カーソルがちょうど右に向かって走り続けるからです。
反転ループカウンタが、我々は上記の言ったforループの「私は> = 0」の事でゼロに成功したときにチェックする必要があるように思えます。
どうすればいいですか?
最初の点は正しいと思います。私のミスに「\ 0」を再入力することで作業しているので、もう1つは私にとって少し奇妙に思えます。 $ t0 == strのとき、どうすれば終了条件を真にすることができますか?私は "枝が等しいならば"派閥が "str"変数を受け取るかどうかわかりません。 – Coursal
私の編集を参照してください。 '$ t0'には完全なアドレスではなくオフセットが含まれていたことを忘れていました。だから、 '$ t0'が0になったら終了するべきです(' $ a0'が0になったときではなく)。あなたはそれが "働いている"と言うかもしれませんが、プログラムが終了し、あなたが配列の範囲外で読んでいたのを見るべきであるときに '$ t0'の値を見てください。 – Michael