首页 > 解决方案 > 字符串的第一个字节意外地为空

问题描述

我编写了以下代码来计算字符串的长度:

strlen:
   # PROLOGUE
    subu $sp, $sp, 8
    sw $ra, 8($sp)
    sw $fp, 4($sp)
    addu $fp, $sp, 8

   # BODY
    #string stored at a0 at the start
    li $v0, 4
    syscall #print string

    li $v0, 0 #starts counter over

    andi $a2, $a0, 0xff    #obtain first byte
    j while

while:
    beqz $a2, ret #exit if null byte encountered
    srl $a0, $a0, 8 #shift to next byte
    andi $a2, $a0, 0xff #obtain first byte again
    add $v0, $v0, 1 #increment counter to be returned
    j while

ret:
    # EPILOGUE
    move $sp, $fp
    lw $ra, ($fp)
    lw $fp, -4($sp)
    jr $ra

它的工作原理是逐字节遍历字符串并递增 v0 直到遇到空字节,然后控制转移到标签 ret 并且程序结束。但是,我的函数似乎总是返回 0,这意味着 v0 永远不会递增,这意味着 a2 在 while 循环开始时为 0。为什么会这样?我已经通过打印系统调用验证了输入字符串实际上是 a0 包含的字符串。

标签: assemblymips

解决方案


这对我有用:

去掉 srl 命令并替换

andi $a2, $a0, 0xff #obtain first byte again

addu $a2, $a0, $v0
lbu  $a2, ($a2)

在进行地址数学运算后加载 a0 的字节 v0。

v0 只需在调用 addu 之前递增。


推荐阅读