用户输入二进制数(即:110100),我需要计算从LSB开始的连续0的数量,所以在110100的情况下它将是2。
我的问题是计算此输入字符串的长度。但我发现这是不可能的,因为我通过
检查 beqz $t2,finished
即使我们知道这不是字符串的结尾,它也会立即停在110的前0位。
我的尝试:
## Read string from user ##
la $a0, str
li $a1, 100
li $v0, 8
syscall
##
## Loop each byte in string until null-terminator is found ##
loop:
move $t0,$t1
add $t0,$t0,$a0 # current address($t0)=counter*1(size of character in bytes)+RAM address of start of array
lb $t2,($t0) # load next byte in string
lw $s0, del
beqz $t2,finished # if current character==null-terminator, exit loop
addi $t1,$t1,1 # increase counter
beqz $t2,addtoh
j loop # loop around
addtoh:
addi $t3,$t3,1 #
j loop # loop around
finished:
##
#################################################
# #
# data segment #
# #
#################################################
.data
str: .space 100
endl: .asciiz "\n"
答案 0 :(得分:1)
我看不到你在哪里初始化$t1
。与高级语言不同,机器代码不会自动初始化内存或寄存器。 $t1
可以在任何地方开始。所以当你这样做时:
move $t0,$t1 # unknown 32-bit value loaded into $t0
add $t0,$t0,$a0 # $t0 is now an unknown number of bytes past (or before!) the start of the buffer
lb $t2,($t0) # load next (random) byte in string
...你最终可能会在内存空间的任何地方查看字节。由于很多这些字节 最终会为零,因此您的代码将比您预期的更早完成。