2016-11-11 122 views
0

我最近问了一个关于MIPS的问题,因为我很难理解它,特别是当涉及到指针时。为什么我的倒车MIPS代码不能正常工作?

我的目标是制作一个函数,它需要2个指针,一个指向一个String的开始,另一个指向它的结束(更具体地说,当我们检测到“。”)时。然后我们开始倒转字符串。

例如:这很好。指针1指向字符串的开头,指针2指向String.length -1“。”

然后,我们开始交换的第一个字符与最后一个,直到我们扭转所有的字符串,所以我们有这样.doog SI SIHT

UPDATE输出:现在下面的功能运作良好

输入大学输出: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 

所以当我们发现一个“‘我们称之为反向,那么我们将继续与句子后’。”检测到,直到我们找到另一个“。”,反向调用。

感谢

+0

对于初学者来说,'b reverse'是错误的,因为它会回到堆栈的东西(根本不需要)。至于其余部分,学习使用调试器来遍历代码并查看错误的位置。 – Jester

+0

当我调试,我看到,在该行(BLT $ A1,$ A0,reverse_end),它的分离SLT $ T1,$ 5,$ 4,则BNE $ 1,$ 0,0x0000000007 我不明白为什么它存在反向一旦它达到$ 1,$ 0,..?而要避免这种情况我尝试使用BEQ $ A1,A0 $,而不是rev​​erse_end但仍然没有工作 – Zok

+0

@Jester我将不胜感激这么多,如果你能帮助我有我的功能工作。 – Zok

回答

2

问题: 你的反向功能依赖于一个事实,即$ A0将有第一个字符的地址和$ A1将有最后一个字符的地址。

但没有在那里你正在更新$ A1指向字符串的结尾。

你从底部第七行:

# add $a0, $a0, $a1 

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

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

猜猜它发现了什么! $ A0有一些地址(开始字符串或取决于你是否对此置评行或不被字符串的结束)但$ A1始终小于128(因为它是字符串的长度) 。它获知$ a1 < $ a0并立即结束该方法。

修复: 你需要的是说:

换句话说,$(最后一个字符=第一个字符+的 字符串长度的地址的地址) a1 = $ a0 + $ v0,MIPS命令为:

add $a1, $a0, $v0

+0

是的,我不知道我是如何错过它,没有很好地关注它。 现在的功能效果很好.. 不过,我想现在做一些修改。比方说,我写了一个文字,如:欧洲。美国。非洲 使用上面我的功能,输出会acirfA .aciremA .eporuE 这意味着我们顺序颠倒了。 我想要输出像.eporuE .aciremA acirfA(我们反转的单词,但不是顺序!!) 相同的功能,但我们需要添加一个修改,检测我们是否读取一个点,我们停止,我们扭转,那么我们就继续使用的最后一个索引作为beghin 4的下一个单词 – Zok

+0

我会重新一级方程式我的问题 – Zok

+0

是的,如果你发布这个新的,独立的问题,它会更好。另外,我建议你尝试使用你现有的功能来完成理想的工作。这似乎并不困难。如果你遇到困难,那么只能发布具体问题的问题,而不是立即提出解决方案或想法。 :) –