MIPS将字符放入字符串中的位置将删除字符串的堆地址

时间:2018-11-07 21:06:37

标签: arrays assembly heap mips indexoutofboundsexception

因此,基本上,我必须从字符数组中插入字符来替换存储在堆中的以空终止的单词。但是,当将字符放回时,它们可以很好地添加到堆地址中,但是当检查循环的下一次迭代时,先前的地址超出范围。我不知道为什么会这样,非常感谢您的帮助。

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中发生错误,并且当我认为它应该只是插入字符的起始位置时,这是一个超出范围的异常。

>

提前感谢,感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

print_string中,您正在执行lw $a0, ($s3),它从地址$s3加载单词(实际数据,即四个字符),并将其作为地址传递给字符串到syscall,显然失败了(您应该在调试器中浏览syscall之前,a0不包含字符串地址,但还有其他内容;字符串的四个字符不太可能形成类似于内存地址的值)堆区域)。

也许您确实希望la $a0, ($s3)s3复制到a0中,但是如果您不需要更新s3本身,则可以更早地完成一条指令: sub $a0, $s3, $t9 # a0 = string address