You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIPS技术问题:如何从读取的字节中生成指定子串?

生成终止点前的目标子串(MIPS汇编实现)

嘿,看起来你已经搞定了子串长度的统计($t0存6这点很赞),接下来生成包含StackO的合法字符串其实就是把缓冲区里的前N个字节复制到新内存,再补上字符串必备的终止符\0就行,我给你拆解成具体的步骤和代码片段:

1. 为新子串分配内存

首先得给目标字符串找块内存——需要的空间是$t0 + 1(多出来的1个字节专门存\0,否则汇编里没法识别成合法字符串)。如果想用动态分配,用sbrk系统调用就行:

# 假设$t0已经存了子串长度(这里是6)
addi $a0, $t0, 1       # 计算所需内存:长度 + 1(空字符)
li $v0, 9              # 调用sbrk系统调用,分配堆内存
syscall
move $s0, $v0          # 把新子串的起始地址存在$s0里,方便后续操作

要是你用的是静态分配的.data段,也可以直接在那里预留一个足够大的数组,跳过动态分配这一步就行。

2. 逐字节复制缓冲区内容

接下来把原缓冲区里的前$t0个字节复制到新内存里。假设原缓冲区的起始地址存在$s1:

move $t1, $zero        # 初始化计数器$t1=0,用来记录当前复制的字节数
copy_loop:
bge $t1, $t0, copy_done  # 当计数器 >= 子串长度时,退出循环
add $t2, $s1, $t1      # 计算原缓冲区当前字节的地址:基地址 + 偏移量
lb $t3, 0($t2)         # 从原缓冲区读取当前字节
add $t4, $s0, $t1      # 计算新子串当前字节的地址
sb $t3, 0($t4)         # 把字节写入新内存
addi $t1, $t1, 1       # 计数器加1,准备复制下一个字节
j copy_loop
copy_done:

3. 补上字符串终止符

这一步绝对不能忘!没有\0的话,后续调用print_string之类的系统调用会乱读内存:

sb $zero, 0($s0, $t0)  # 在新子串的第$t0个偏移位置写入空字符,也就是末尾

做完这些,$s0指向的内存区域就是完整的StackO\0字符串了,你可以用打印系统调用验证一下:

move $a0, $s0
li $v0, 4
syscall

内容的提问来源于stack exchange,提问作者Paulo Calado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:53:02