в асм код
sb $zero 0($t1) # runtime exception if i uncomment this line
вы используете $t1
в качестве адреса байта, который хотите очистить.
Но это не так.
Вы использовали
la $t0 ($a0) #copying the string address
и все ваши доступы используют $t0
.
В конце вашей функции parsing_string
вы читаете символ по адресу $t0
и вставляете его в $t1
:
lbu $t1 ($t0) # the next byte
, затем вы вернетесь к parsing_string
, проверьте, если t1 равно 0
beq $t1 0 remove_line_feed # reaching the NULL character '\0'
перейти к remove_line_feed
remove_line_feed :
sb $zero 0($t1) # runtime exception if i uncomment this line
j end
Где вы пытаетесь написать ноль по адресу 0+$t1
(который вы только что проверили как равный нулю).
И симулятор правильно сообщает вам, что вы пытаетесь написать по адресу 0, и выдает ошибку.
Если вы измените свой код на
remove_line_feed :
sb $zero 0($t0) # runtime exception if i uncomment this line
j end
это удалит ошибку времени выполнения.
Но это не сделает ваш код правильным. То, что вы хотите сделать, это очистить '\ n', который является непосредственно перед \0
, и ваш код должен быть
remove_line_feed :
sb $zero -1($t0)
j end
Кроме того, вы можете изменить сравнение и вместо поиска окончательного \0
строки выполнить поиск по 10 (перевод строки ascii) и заменить тот же символ на 0.