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

如何在MIPS汇编中根据输入索引偏移字符串并输出子串?

MIPS汇编中字符串索引偏移的实现方法

核心逻辑

MIPS中字符串以字节连续存储,每个ASCII字符占1字节。要获取从指定索引开始的子串,只需将字符串的起始地址与输入的索引值相加,得到偏移后的起始地址,再用这个地址调用打印字符串的系统调用即可。核心指令用add(或addu,避免溢出检查)完成地址计算。

代码修改与解释

你已完成字符串和索引的输入流程,只需修改打印子串的部分,同时建议添加索引合法性检查(避免越界打印乱码):

  1. 先加载字符串起始地址到寄存器,再计算偏移后的地址:
    la $t1, string       # 把字符串起始地址加载到t1
    add $a0, $t1, $t0    # 起始地址 + 索引 = 子串起始地址,存入系统调用参数寄存器a0
    
  2. 合法性检查:遍历字符串计算长度,判断输入的索引是否为负或超过字符串长度,非法则输出错误提示。

完整修改后的代码

.data
string: .space 51  # 预留51字节(含字符串终止符)
prompt_string: .asciiz "Enter a string: "
prompt_index: .asciiz "Enter the index: "
prompt_substring: .asciiz "The substring is: "
prompt_error: .asciiz "Error: Invalid index!\n"

.text
# 提示输入字符串并读取
li $v0, 4
la $a0, prompt_string
syscall

li $v0, 8
la $a0, string
li $a1, 50  # 最多读取50字节(留1字节给终止符)
syscall

# 提示输入索引并读取
li $v0, 4
la $a0, prompt_index
syscall

li $v0, 5
syscall
move $t0, $v0  # 输入的索引存入t0

# 计算字符串长度(用于合法性检查)
la $t1, string
move $t2, $t1  # t2用于遍历字符串
li $t3, 0      # t3记录字符串长度
length_loop:
lb $t4, ($t2)
beq $t4, 0, length_done  # 遇到终止符结束遍历
addi $t3, $t3, 1
addi $t2, $t2, 1
j length_loop
length_done:

# 检查索引合法性:不能为负,且小于字符串长度
blt $t0, 0, print_error
bge $t0, $t3, print_error

# 打印子串提示
li $v0, 4
la $a0, prompt_substring
syscall

# 计算偏移地址并打印子串
la $t1, string
add $a0, $t1, $t0
li $v0, 4
syscall

# 退出程序
li $v0, 10
syscall

# 打印错误信息分支
print_error:
li $v0, 4
la $a0, prompt_error
syscall
li $v0, 10
syscall

关键指令说明

  • la $t1, string:将字符串的起始内存地址加载到寄存器t1。
  • add $a0, $t1, $t0:把字符串起始地址和索引值相加,得到子串的起始地址,存入系统调用的参数寄存器$a0。
  • blt/bge:用于索引合法性判断,分别是“小于则跳转”和“大于等于则跳转”指令。

内容的提问来源于stack exchange,提问作者Jenny Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:47:32