assembly - 字符串的第一个字节意外地为空
问题描述
我编写了以下代码来计算字符串的长度:
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 包含的字符串。
解决方案
这对我有用:
去掉 srl 命令并替换
andi $a2, $a0, 0xff #obtain first byte again
和
addu $a2, $a0, $v0
lbu $a2, ($a2)
在进行地址数学运算后加载 a0 的字节 v0。
v0 只需在调用 addu 之前递增。
推荐阅读
- docker - Fn 项目缺少 http 操作 (CRUD)
- regex - 自定义 str 函数在正则表达式搜索中引发类型错误
- css - 使用行列索引 -WPF 从后端将背景设置为 DataGrid 中的单个单元格
- c - 结构的内存分配/结构的值
- javascript - React shouldComponentUpdate 检测变化
- java - 服务 com.google.android.youtube.api.service.YouTubeService 已泄露 IntentReceiver - 集成 YouTube API 时出错
- regex - 正则表达式删除两个标签之间的字符串的一部分
- android - Whatsapp 在 android 中共享音频文件时正在剪切音频文件
- render - A 帧渲染 lop 和视图刷新
- java - Groovy Shell 脚本对象未完全执行