You need to enable JavaScript to run this app. MIPS汇编中如何实现按用户输入次数打印Hello World
优惠活动
大模型
产品
解决方案
定价
更多

MIPS汇编中如何实现按用户输入次数打印Hello World

按输入次数循环打印Hello World的MIPS汇编实现说明

现有代码存在的可运行问题

  • 代码引用了未在.data段定义的nl标签,执行到对应打印字符串的系统调用时会触发非法内存访问报错
  • 未实现循环控制逻辑,读入用户输入的打印次数后仅能执行单次字符串打印,完全匹配不了“按输入值重复输出”的需求
  • 原有计数逻辑完全错位:mul $t0, $a0, 1会把系统调用专用参数寄存器$a0的值作为计算源,直接覆盖后续打印操作需要的字符串地址,哪怕补上循环逻辑也无法正常输出
  • 缺失程序退出的系统调用,所有指令执行完成后会跳转到未定义的内存区域随机执行,产生不可预期的运行错误
  • 定义的mychar1变量无实际使用场景,保留也不影响程序运行

修正后的实现流程

  1. 补上缺失的换行符字符串nl的定义
  2. 按原有逻辑完成初始提示打印、用户输入读取与存储
  3. 将读入的打印次数加载到专用计数寄存器,作为循环终止的判断依据
  4. 搭建循环逻辑:每次进入循环先判断剩余待打印次数是否为0,为0则直接跳出循环;不为0则先将剩余次数减1,执行Hello World字符串打印,再跳转回循环判断起点
  5. 循环结束后调用退出系统调用,正常终止程序运行

可直接运行的完整修正代码

.data
    n:      .space 4
    msg:    .asciiz "Hello World"
    prom1:  .asciiz "How many Hello World want to be printed: "
    out_string:   .asciiz "\nHello World\n"
    # 补充缺失的换行标签定义
    nl:     .asciiz "\n"

.text
    main:
        # 打印初始Hello World内容
        li $v0, 4
        la $a0, msg
        syscall

        # 打印换行
        li $v0, 4
        la $a0, nl
        syscall

        # 打印用户输入提示
        li $v0, 4
        la $a0, prom1
        syscall

        # 读取用户输入的整数并存入n变量
        li $v0, 5
        syscall
        sw $v0, n

        # 加载待打印次数到计数寄存器$t0
        lw $t0, n
loop_start:
        # 剩余打印次数为0则跳出循环
        beq $t0, $zero, program_exit
        # 剩余次数减1
        addi $t0, $t0, -1
        # 打印Hello World字符串
        li $v0, 4
        la $a0, out_string
        syscall
        # 跳转回循环判断起点
        j loop_start
program_exit:
        # 调用系统调用正常退出程序
        li $v0, 10
        syscall

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 21:15:09