MIPS中仅用两个循环实现数组逆序打印及最大元素查找
MIPS 双循环实现数组逆序打印+最大值查找实现方案
实现思路
- 第一个循环保持原有逻辑,完成数组长度n的读取和n个整数的数组写入
- 第二个循环逆序遍历数组时,新增一个寄存器存储当前最大值,每次取出数组元素打印前同步完成最大值比对更新,完全不影响原有逆序打印的逻辑流
完整可运行代码
.data prompt_n: .asciiz "请输入数组元素个数n:" prompt_elem: .asciiz "请输入第" prompt_elem2: .asciiz "个整数:" reverse_msg: .asciiz "The array in reverse is: " comma: .asciiz ", " max_msg: .asciiz "\nThe largest element is: " end_msg: .asciiz "\nThank you and have a nice day!" .align 2 array: .space 100 # 预留空间支持最多存储25个整数,可按需调整 .text .globl main main: # 第一个循环:读取n并构建数组 li $v0, 4 la $a0, prompt_n syscall li $v0, 5 syscall move $s0, $v0 # $s0存储数组长度n li $s1, 0 # $s1存储数组构建时下标 build_loop: bge $s1, $s0, build_end # 输出输入元素提示 li $v0,4 la $a0,prompt_elem syscall li $v0,1 addi $a0,$s1,1 syscall li $v0,4 la $a0,prompt_elem2 syscall # 读取元素存入数组 li $v0,5 syscall sll $t0, $s1, 2 sw $v0, array($t0) addi $s1, $s1, 1 j build_loop build_end: # 第二个循环前置准备 li $v0,4 la $a0, reverse_msg syscall addi $s1, $s0, -1 # 逆序遍历从最后一个元素下标开始 li $s2, -2147483648 # $s2存储当前最大值,初始化为int类型最小值 reverse_loop: blt $s1, 0, reverse_end sll $t0, $s1, 2 lw $t1, array($t0) # 取出当前逆序遍历到的元素 # 最大值比对逻辑,不影响后续打印流程 bge $s2, $t1, skip_update_max move $s2, $t1 skip_update_max: # 原有逆序打印逻辑完全保留 li $v0,1 move $a0, $t1 syscall # 最后一个元素不打印逗号 beq $s1, 0, skip_comma li $v0,4 la $a0, comma syscall skip_comma: addi $s1, $s1, -1 j reverse_loop reverse_end: # 打印最大值 li $v0,4 la $a0, max_msg syscall li $v0,1 move $a0, $s2 syscall # 打印结束语 li $v0,4 la $a0, end_msg syscall # 程序退出 li $v0,10 syscall
运行验证
输入测试用例:
5 0 1 3 2 5
输出结果完全符合要求:
The array in reverse is: 5, 2, 3, 1, 0 The largest element is: 5 Thank you and have a nice day!
内容的提问来源于stack exchange,提问作者WeekendJedi
相关产品推荐
相关产品推荐

