这个 MIPS 汇编代码可以简化吗?
Can this MIPS assembly code be simplified?
我正在尝试编写一个函数来计算具有最少动态指令数的字符串的长度。这是我目前拥有的:
strlen:
li $v0, 0 # len = 0
top:
lbu $t0, 0($a0) # get char
addi $v0, $v0, 1 # len++
addiu $a0, $a0, 1 # *s++
bne $t0, [=10=], top #if char != '[=10=]', loop
ret:
addiu $v0, $v0, -1
jr $ra
我正在尝试将其缩减为 10 个字符的字符串,因此将其变成递归函数并不是“改进”。有没有可能从这里减少指令的数量?
你不需要在循环中增加一个计数器,你可以减去end - start
来得到长度。例如:
strlen:
addiu $v0, $a0, 1 # start + 1
top:
lbu $t0, 0($a0) # get char
addiu $a0, $a0, 1 # s++
bne $t0, [=10=], top # if char != '[=10=]', loop
ret:
subu $v0, $a0, $v0 # (end+1) - (start+1)
jr $ra
我正在尝试编写一个函数来计算具有最少动态指令数的字符串的长度。这是我目前拥有的:
strlen:
li $v0, 0 # len = 0
top:
lbu $t0, 0($a0) # get char
addi $v0, $v0, 1 # len++
addiu $a0, $a0, 1 # *s++
bne $t0, [=10=], top #if char != '[=10=]', loop
ret:
addiu $v0, $v0, -1
jr $ra
我正在尝试将其缩减为 10 个字符的字符串,因此将其变成递归函数并不是“改进”。有没有可能从这里减少指令的数量?
你不需要在循环中增加一个计数器,你可以减去end - start
来得到长度。例如:
strlen:
addiu $v0, $a0, 1 # start + 1
top:
lbu $t0, 0($a0) # get char
addiu $a0, $a0, 1 # s++
bne $t0, [=10=], top # if char != '[=10=]', loop
ret:
subu $v0, $a0, $v0 # (end+1) - (start+1)
jr $ra