为什么我的反向 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
我最近问了一个关于 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