MIPS汇编中如何实现按用户输入次数打印Hello World
按输入次数循环打印Hello World的MIPS汇编实现说明
现有代码存在的可运行问题
- 代码引用了未在.data段定义的
nl标签,执行到对应打印字符串的系统调用时会触发非法内存访问报错 - 未实现循环控制逻辑,读入用户输入的打印次数后仅能执行单次字符串打印,完全匹配不了“按输入值重复输出”的需求
- 原有计数逻辑完全错位:
mul $t0, $a0, 1会把系统调用专用参数寄存器$a0的值作为计算源,直接覆盖后续打印操作需要的字符串地址,哪怕补上循环逻辑也无法正常输出 - 缺失程序退出的系统调用,所有指令执行完成后会跳转到未定义的内存区域随机执行,产生不可预期的运行错误
- 定义的
mychar1变量无实际使用场景,保留也不影响程序运行
修正后的实现流程
- 补上缺失的换行符字符串
nl的定义 - 按原有逻辑完成初始提示打印、用户输入读取与存储
- 将读入的打印次数加载到专用计数寄存器,作为循环终止的判断依据
- 搭建循环逻辑:每次进入循环先判断剩余待打印次数是否为0,为0则直接跳出循环;不为0则先将剩余次数减1,执行Hello World字符串打印,再跳转回循环判断起点
- 循环结束后调用退出系统调用,正常终止程序运行
可直接运行的完整修正代码
.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
相关产品推荐
相关产品推荐

