字符串的第一个字节意外地为空
First byte of string ends up unexpectedly being null
我写了下面的代码来计算一个字符串的长度:
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,程序结束。但是,我的函数似乎总是 return 0,这意味着 v0 永远不会递增,这意味着 while 循环开始时 a2 为 0。为什么会这样?我已经验证输入字符串实际上是 a0 通过打印系统调用包含的字符串。
这对我有用:
删除 srl 命令并替换
andi $a2, $a0, 0xff #obtain first byte again
和
addu $a2, $a0, $v0
lbu $a2, ($a2)
在计算地址后加载 a0 的字节 v0。
v0 只需在调用 addu 之前递增。
我写了下面的代码来计算一个字符串的长度:
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,程序结束。但是,我的函数似乎总是 return 0,这意味着 v0 永远不会递增,这意味着 while 循环开始时 a2 为 0。为什么会这样?我已经验证输入字符串实际上是 a0 通过打印系统调用包含的字符串。
这对我有用:
删除 srl 命令并替换
andi $a2, $a0, 0xff #obtain first byte again
和
addu $a2, $a0, $v0
lbu $a2, ($a2)
在计算地址后加载 a0 的字节 v0。
v0 只需在调用 addu 之前递增。