为什么我的反向 MIPS 代码不能正常工作?

Why isn't my reversing MIPS code working correctly?

我最近问了一个关于 MIPS 的问题,因为我很难理解它,尤其是涉及到指针时。

我的 objective 是创建一个函数,它接受 2 个指针,一个指向 String 的开头,第二个指向它的结尾(更具体地说,当我们检测到 "." 时)。然后我们开始反转字符串。

例如:这很好。指针1指向String的开头,指针2指向String.length -1 "."

然后我们开始交换第一个字符和最后一个字符,直到我们反转所有字符串,所以我们得到这样的输出 .doog si sihT

更新:现在下面的功能运行良好

输入大学输出:ytisrevinU

现在我想做一个小修改,当我们阅读以“.”分隔的长文本时,我们将每个句子倒转而不改变顺序。

输入:加拿大比美国冷。美国比欧洲冷。

(使用我们的函数我们将得到):.eporuE naht redloc si aciremA .aciremA naht redloc si adanaC

我想要的东西:.aciremA naht redloc si adanaC。 eporuE naht redloc si aciremA

 # 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, [=10=],[=10=] # 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, [=10=], 128
addi $t0, [=10=], 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指向字符串的末尾。

你的倒数第 7 行:

# add $a0, $a0, $a1

相当于$a0 = $a0 + $a1。 由于$a1 = 长度,$a0 = 字符串的起始地址,执行完上述行后,$a1 仍然是长度,$a0 是字符串的结尾。

现在,当您的反向函数启动时,它会检查 $a0 和 $a1 的值并进行比较。

猜猜它找到了什么! $a0 有一些地址(字符串的开头或字符串的结尾取决于您是否注释掉该行但是 $a1 总是小于128(因为它是字符串的长度)。它了解到 $a1 < $a0 并立即结束该方法。

修复: 你需要说的是:

(address of last character = address of first character + length of the string)

换句话说,$a1 = $a0 + $v0,MIPS 命令为:

add $a1, $a0, $v0