Нет проблем различать ноль и «0». ноль равен 0, а '\ 0' равен 48.
Ваш тест
beq $t2, $zero, end_loop # terminate if null-value found
совершенно правильно и обнаружит конец строки.
Что неверно в вашем алгоритме.
Способ дополнить число в C будет:
while(c=*str){
c=c-'0' ; // transform the number to integer
c=9-c; // complement it
c += '0'; // add 48 to turn it back to a character
str++;
}
Вам не хватает последнего преобразования в символ.
Если вы измените
sub $t2, $t1, $t2 # apply complement to $t2
до
sub $t2, $t1, $t2 # apply complement to $t2
addi $t2, $t2, 48
все должно работать.
В качестве альтернативы, вы можете упростить ваш алгоритм и заметить, что вычисление c=9-(c-48)+48
эквивалентно c=105-c
. Добавить перед start_loop
li $t4 105 ##
и заменить три строки
subi $t2, $t2, 48 # convert it to a digit
sub $t2, $t1, $t2 # apply complement to $t2
addi $t2, $t2, 48
по
sub $t2,$t4,$t2 # complement to 9 directly on char representing the digit