区分空值和“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
. 在开始循环之前添加
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