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
相关产品推荐
相关产品推荐

