为什么我的可逆MIPS代码无法正常工作?

时间:2016-11-11 19:18:03

标签: assembly mips reverse mips32

我最近问了一个关于MIPS的问题,因为我很难理解它,特别是在指针方面。

我的目标是创建一个带2个指针的函数,一个指向String的开头,第二个指向它的结束(更具体地说,当我们检测到"。" )。然后我们开始反转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, $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,然后我们继续执行"。"之后的句子。检测到,直到我们找到另一个"。",调用反向。

由于

1 个答案:

答案 0 :(得分:2)

<强>问题: 你的反向函数依赖于$ a0将具有第一个字符的地址而$ a1将具有最后一个字符的地址的事实。

但是没有你要更新$ a1指向字符串结尾的地方。

你自下而上的第7行:

# add $a0, $a0, $a1

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

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

猜猜它发现了什么! $ a0有一些地址(字符串的开头或字符串的结尾取决于你是否评论该行但是$ a1总是小于128(因为它是字符串的长度)。它得知$ a1&lt; $ a0并立即结束方法。

<强>修正: 你需要的是说:

  

(最后一个字符的地址=第一个字符的地址+长度的   字符串)

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

add $a1, $a0, $v0