从我今天的问题历史中可以明显看出,我正在开发一个MIPS项目,该项目将反转字符串,在本例中为“Hello,World”。我想我的循环和字符串反转函数是正确的,但我无法弄清楚交换函数本身,或者如何输出被操纵的字符串。
我知道这样的基本交换是:
sll $t1, $a1, 2
add $t1, $a0,$t1
lb $t0,0($t1)
lb $t2, 4($t1)
sb $t0,0($t1)
sb $t2, 4($t1)
jr $ra
但我不知道那是做什么或如何解释它以适应我的代码。如果那里有一些神圣的圣徒可以解释它是如何工作的以及系统调用是如何工作的,那么我将永远感激不尽。我的代码如下:
.data
string: .asciiz "Hello, World!"
.text
main:
li $v0, 4
la $a0, string #store string in a0
syscall
jal stringreverse
stringreverse:
add $t0,$a0,$zero #base address of string
add $a1, $zero,14 #stores size of string in a1
addi $t2, $a1, -1 #j = length -1
add $t3,$zero,$zero #i = 0
loop:
jal swap
addi $t2,$t2,-1 #j--
addi $t3,$t3,+1 #i++
slt $t7,$t3,$t2 #set t7 to 1 when j is less than i
bne $t7,$zero,loop # if i is greater than j, keep looping
j done
swap: #swaps the sooner element with the later and returns back to the loop
lb $v0,0($t3) # updated to fit my registers t3 =i
lb $v1,0($t2) # updated to fit my registers t2 =j
sb $v1,0($t3)
sb $v0,0($t2)
jr $ra
done:
.....procedure here.....
syscall
答案 0 :(得分:0)
看起来你像l(加载地址指令)一样处理lb(加载字节指令)。
你可能想做更像这样的事情:
swap:
lb $temp1, str($t2) #load temp1 address with byte at $t2 in str
lb $temp2, str($t1) #load temp2 address with byte at $t1 in str
sb $temp2, str($t2) #store temp2 byte into $t2'th position in str
sb $temp1, str($t1) #store temp1 byte into $t1'th position in str
jr $ra
有一些数据,如:
.data
str:
.asciiz "your string here"
希望这能为你解决一些问题。