MIPS 将字符放入字符串中的位置是删除字符串的堆地址
MIPS putting characters into positions in a string is deleting the heap addresses of the string
所以基本上我必须从字符数组中插入字符来替换存储在堆中的以 null 结尾的单词。但是,当将字符放回原位时,它们会很好地添加到堆地址中,但是在检查循环的下一次迭代时,先前的地址超出范围。我不知道为什么会这样,非常感谢任何帮助。
chars_to_word: # get characters from array and turn into word
li $t0, 0 # counter for loop
la $s4, ($s5) # go to start of char array
sub $s3, $s3, $t9 # go to previous address of heap (due to earlier increment)
ctw_loop:
beq $s0, $t0, print_string # branch when end of char array
la $t1, ($s3) # $t1 = word[i]
lb $t3, ($s4) # load char from array to put into string
sb $t3, ($t1) # put char into heap at index
addi $t0, $t0, 1
addi $s3, $s3, 1
add $s4, $s4, $t9
j ctw_loop
print_string:
sub $s3, $s3, $t9
lw $a0, ($s3)
li $v0, 4
syscall
j exit
说明一下,$s4是字符数组的地址,$s5是保留的字符数组起始地址,$s3是字符串堆的位置,$t9是每个部分的共同大小堆和数组。
print_string试图回到字符串堆的起始位置打印时出现错误,当我认为它应该正好在插入的字符是。
提前致谢,感谢您的帮助!
在 print_string
中,您正在执行 lw $a0, ($s3)
从地址 $s3
加载字(实际数据,即四个字符)并将其作为地址传递给字符串 syscall
,这显然失败了(您应该在调试器中看到 syscall
,a0
不包含字符串地址,而是其他内容;字符串的四个字符不太可能形成类似于内存的值地址到堆区)。
也许您确实希望 la $a0, ($s3)
将 s3
复制到 a0
,但如果您不需要更新 s3
,则可以提前一条指令执行此操作本身:sub $a0, $s3, $t9 # a0 = string address
所以基本上我必须从字符数组中插入字符来替换存储在堆中的以 null 结尾的单词。但是,当将字符放回原位时,它们会很好地添加到堆地址中,但是在检查循环的下一次迭代时,先前的地址超出范围。我不知道为什么会这样,非常感谢任何帮助。
chars_to_word: # get characters from array and turn into word
li $t0, 0 # counter for loop
la $s4, ($s5) # go to start of char array
sub $s3, $s3, $t9 # go to previous address of heap (due to earlier increment)
ctw_loop:
beq $s0, $t0, print_string # branch when end of char array
la $t1, ($s3) # $t1 = word[i]
lb $t3, ($s4) # load char from array to put into string
sb $t3, ($t1) # put char into heap at index
addi $t0, $t0, 1
addi $s3, $s3, 1
add $s4, $s4, $t9
j ctw_loop
print_string:
sub $s3, $s3, $t9
lw $a0, ($s3)
li $v0, 4
syscall
j exit
说明一下,$s4是字符数组的地址,$s5是保留的字符数组起始地址,$s3是字符串堆的位置,$t9是每个部分的共同大小堆和数组。
print_string试图回到字符串堆的起始位置打印时出现错误,当我认为它应该正好在插入的字符是。
提前致谢,感谢您的帮助!
在 print_string
中,您正在执行 lw $a0, ($s3)
从地址 $s3
加载字(实际数据,即四个字符)并将其作为地址传递给字符串 syscall
,这显然失败了(您应该在调试器中看到 syscall
,a0
不包含字符串地址,而是其他内容;字符串的四个字符不太可能形成类似于内存的值地址到堆区)。
也许您确实希望 la $a0, ($s3)
将 s3
复制到 a0
,但如果您不需要更新 s3
,则可以提前一条指令执行此操作本身:sub $a0, $s3, $t9 # a0 = string address