【发布时间】:2020-04-14 16:29:50
【问题描述】:
我写了以下代码来计算字符串的长度:
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 包含的字符串。
【问题讨论】:
-
我希望在此函数中看到
lb或lbu,但似乎没有。andi不会从内存中加载任何内容。