簡體   English   中英

為什么我的MIPS反向代碼無法正常工作?

[英]Why isn't my reversing MIPS code working correctly?

我最近問了一個有關MIPS的問題,因為我很難理解它,尤其是在涉及指針時。

我的目標是制作一個帶有2個指針的函數,一個指針指向String的開頭,第二個指針指向String的結尾(更具體地講,當我們檢測到“。”時)。 然后,我們開始反轉字符串。

例如:這很好。 指針1指向String的開頭,指針2指向String.length -1“。

然后我們開始將第一個char與最后一個char交換,直到我們反轉所有String為止,這樣我們就得到了這樣的輸出。doog si sihT

更新 :現在下面的功能很好用

輸入大學輸出:ytisrevinU

現在,我想做一個小的修改,以便當我們閱讀用“。”分隔的長文本時,我們在不改變順序的情況下反轉每個句子。

輸入:加拿大比美國冷。 美國比歐洲冷。

(使用我們的功能,我們將獲得):.eporuE naht redloc si adanaC .aciremA naht redloc si adanaC

我要擁有的內容:.aciremA naht redloc si adanaC。 全國性的地方紅十字會

 # Program to reverse a string input by the user
 .data
 array: .space 128
 input: .asciiz "Enter a string: "
 size: .word 128

.text

 j main


length:
# return length of the input string
# $a0 - address of string
# $v0 - length of the string
add $v0, $0,$0 # set $v0 to 0
loop:
lb  $t0, 0($a0)     #load byte
beqz $t0, fin   #if null
addi $v0, $v0, 1    #increase the length
addi $a0, $a0, 1    #next
j loop      #recursive call
fin:
subi $v0,$v0,1
jr $ra      #return

reverse:
blt $a1, $a0, reverse_end
lb $t0, ($a0)
lb $t1, ($a1)
sb $t0, ($a1)
sb $t1, ($a0)
addi $a0, $a0, 1
addi $a1, $a1, -1
b reverse

reverse_end:
li $v0, 0
jr $ra

main:
addi $s0, $0, 128
addi $t0, $0, 0

la $a0, input   #service call to add the input String @
li $v0, 4       #affichage
syscall
# read string from the user into $a0
la $a0, array
lw $a1, size
li $v0, 8
syscall
jal length# $v0 contains length of string

# reverse the string
la $a0, array       #Lire le string
move $a1, $v0       # Put in a1 the length's result
add $a1, $a0, $v0   # pointer to the last character
jal reverse

# print the reverse string
la $a0, array
li $v0, 4
syscall 

因此,當我們檢測到“。”時,我們將其稱為“ reverse”,然后繼續“。”之后的句子。 檢測到,直到找到另一個“。”,再調用反向。

謝謝

問題:您的反向函數依賴於以下事實:$ a0將具有第一個字符的地址,而$ a1將具有最后一個字符的地址。

但是沒有任何地方要更新$ a1以指向字符串的末尾。

您從底部開始的第七行:

# add $a0, $a0, $a1

等價於$ a0 = $ a0 + $ a1。 由於$ a1 =字符串的長度和$ a0 =字符串的開始地址,因此在執行上一行后,$ a1仍然是字符串的長度,而$ a0是字符串的結尾。

現在,當您的反向函數啟動時,它將檢查$ a0和$ a1的值並進行比較。

猜猜發現了什么! $ a0有一些地址( 字符串的開頭還是字符串的結尾,取決於您是否注釋掉該行 ), 但是$ a1始終小於128(因為它是字符串的長度) 它得知$ a1 <$ a0並立即結束該方法。

修復:您需要說的是:

(最后一個字符的地址=第一個字符的地址+字符串的長度)

換句話說,$ a1 = $ a0 + $ v0,為此的MIPS命令為:

add $a1, $a0, $v0

暫無
暫無

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

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