簡體   English   中英

裝配MIPS:反向打印字符串

[英]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, 1lb 之前 ,而不是之后),否則您首先要閱讀在readingloop找到的NUL終止readingloop

  • reversingloop的退出條件不應是您已經找到了NUL終止符,因為NUL終止符位於字符串的末尾 ,並且您正在向字符串的開頭進行迭代(順便說一句,您鍵入錯了'\\0'在一個地方為'0' )。 退出條件應為$t0等於0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM