MIPS, помещающий символы в позиции в строке, удаляет кучу адресов строки - PullRequest
0 голосов
/ 08 ноября 2018

Так что в основном я должен вставить символы из массива символов, чтобы заменить слово с нулевым символом в конце, хранящееся в куче. Однако, когда символы возвращаются обратно, они добавляются в адрес кучи нормально, но при проверке следующей итерации цикла предыдущие адреса выходят за пределы. Я понятия не имею, почему это происходит, и любая помощь очень ценится.

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 голосов
/ 08 ноября 2018

В print_string вы делаете lw $a0, ($s3), который загружает слово (фактические данные, т.е. четыре символа) с адреса $s3 и передает его как адрес в строку в syscall, что, очевидно, не удается (вы должны увидеть в отладчике перед тем, как перешагнуть syscall, a0 не содержит строковый адрес, но что-то еще; вряд ли четыре символа строки образуют значение, которое будет напоминать адрес памяти в области кучи).

Возможно, вы действительно хотите, чтобы la $a0, ($s3) скопировал s3 в a0, но вы можете сделать это уже одной инструкцией ранее, если вам не нужно обновлять s3 само по себе: sub $a0, $s3, $t9 # a0 = string address

...