String 这个MIPS汇编代码可以简化吗?

String 这个MIPS汇编代码可以简化吗?,string,assembly,mips,micro-optimization,simplify,String,Assembly,Mips,Micro Optimization,Simplify,我试图编写一个函数,用最少的动态指令计算字符串的长度。这就是我现在所拥有的: 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, $0, to

我试图编写一个函数,用最少的动态指令计算字符串的长度。这就是我现在所拥有的:

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, $0, top        #if char != '\0', loop
ret:
    addiu   $v0, $v0, -1
    jr      $ra

我试图将它简化为一个10个字符的字符串,因此将其转换为一个递归函数并不是一个“改进”。从这里可以减少指令的数量吗?

您不需要增加循环中的计数器,您可以减去
结束-开始
来获得长度。例如:

strlen:
    addiu  $v0, $a0, 1   # start + 1

top:  
    lbu    $t0, 0($a0)   # get char
    addiu  $a0, $a0, 1   # s++
    bne    $t0, $0, top  # if char != '\0', loop
ret:
    subu   $v0, $a0, $v0 # (end+1) - (start+1)
    jr     $ra
   

哪些指令是动态指令?@ScottHunter:“动态指令计数”是实际执行的指令数,而不是您在反汇编中看到的指令数。这里的措辞很尴尬(“动态指令”不是一件事),但这就是它的意思。e、 像循环展开这样的事情是可能的:较大的代码大小,但如果跳闸计数较高,实际执行的指令会更少。不过,这与简化相反。但是如果你真的关心strlen的性能,请看——MIPS上使用了逐字逐句的C。将其转换为递归函数并不是一种“改进”——这根本不是asm的改进,无论是大问题还是小问题,或者是简单循环都可以做到的!您必须保存一整堆返回地址。即使您需要手动实现堆栈数据结构,这通常也会更高性能,只是更难正确写入。只要有可能,C编译器甚至会将C递归转换为asm循环。