[英]Assembly MIPS: Reverse Printing a string
假設我們輸入單詞“ test”,並且希望程序返回該單詞反轉的輸出(“ tset”)。
使用C,典型的for循環可以輕松地完成此工作。
for(i='/0'; i>=0; i--)
printf("%c", str[i]);
但是在MIPS上,事情至少變得相當混亂。
在嘗試通過制作兩個循環來使其工作。 一個用於簡單讀取字符串的每個字符,另一個用於反向打印它們:
.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循環的“ i> = 0”處成功通過零時。
怎么會這樣
您的代碼有一些問題:
reversingloop
應該先遞減$t0
(即subiu $t0, $t0, 1
在lb
之前 ,而不是之后),否則您首先要閱讀在readingloop
找到的NUL終止readingloop
。
reversingloop
的退出條件不應是您已經找到了NUL終止符,因為NUL終止符位於字符串的末尾 ,並且您正在向字符串的開頭進行迭代(順便說一句,您鍵入錯了'\\0'
在一個地方為'0'
)。 退出條件應為$t0
等於0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.