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

MIPS汇编如何打印字符串的部分子串:提取HELLO!前3个字符HEL

MIPS打印字符串前3个字符实现方案

首先说明你提供的代码存在两处核心错误:

  • lw $t6, string 指令使用错误:lw作用是加载内存地址存储的数值到寄存器,你需要的是字符串的首地址,应该用地址加载伪指令la $t6, string
  • lb $a0, 0-2($t6) 逻辑错误:lb一次只能加载1个字节(单个ASCII字符),且打印字符串的系统调用(编号4)要求$a0存储以\0结尾的字符串首地址,不是直接存储字符内容

下面给两种可用的实现方案:

方案1:临时插入终止符(不修改原字符串最终内容)

原理是先暂存字符串第4位(下标3)的原有字符,临时替换为\0终止符,打印完成后再把原有字符写回,不会改变原字符串的最终内容:

.data
    string: .asciiz "HELLO!"

.text
    # 加载字符串首地址到$t0
    la $t0, string
    # 暂存下标3位置的原有字符(第二个'L')
    lb $t1, 3($t0)
    # 把下标3位置临时改为终止符'\0'
    sb $zero, 3($t0)
    # 打印字符串,识别到'\0'就会停止,输出前3个字符HEL
    move $a0, $t0
    li $v0, 4
    syscall
    # 回写原有字符,恢复原字符串
    sb $t1, 3($t0)

    # 程序退出
    li $v0, 10
    syscall

方案2:单独打印单个字符

不需要修改原字符串,直接用打印单个字符的系统调用(编号11),依次加载前3个字符打印即可:

.data
    string: .asciiz "HELLO!"

.text
    la $t0, string
    # 打印第一个字符H
    lb $a0, 0($t0)
    li $v0, 11
    syscall
    # 打印第二个字符E
    lb $a0, 1($t0)
    syscall
    # 打印第三个字符L
    lb $a0, 2($t0)
    syscall

    # 程序退出
    li $v0, 10
    syscall

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:00