我最近问了一个关于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
所以当我们发现一个“‘我们称之为反向,那么我们将继续与句子后’。”检测到,直到我们找到另一个“。”,反向调用。
感谢
对于初学者来说,'b reverse'是错误的,因为它会回到堆栈的东西(根本不需要)。至于其余部分,学习使用调试器来遍历代码并查看错误的位置。 – Jester
当我调试,我看到,在该行(BLT $ A1,$ A0,reverse_end),它的分离SLT $ T1,$ 5,$ 4,则BNE $ 1,$ 0,0x0000000007 我不明白为什么它存在反向一旦它达到$ 1,$ 0,..?而要避免这种情况我尝试使用BEQ $ A1,A0 $,而不是reverse_end但仍然没有工作 – Zok
@Jester我将不胜感激这么多,如果你能帮助我有我的功能工作。 – Zok