MIPS运行时实现连续K元素块求和的汇编代码问题咨询
嘿,我来帮你补全这个MIPS汇编程序,实现你需要的连续K个元素求和功能~先理清楚核心思路:我们需要先读入K,然后处理输入的序列,用滑动窗口的方式计算每连续K个元素的和——一开始先攒够K个元素求和输出,之后每新增一个元素,就减去窗口里最老的那个元素,加上新元素,再输出新的和,直到遇到0为止。
完整的MIPS汇编实现代码
.globl main .data prompt_k: .asciiz "请输入整数K: " prompt_seq: .asciiz "请输入以0结尾的非零整数序列: " space: .asciiz " " .text main: # 提示用户输入K li $v0, 4 la $a0, prompt_k syscall # 读取整数K到$a1(你定义的$K) li $v0, 5 syscall move $a1, $v0 # $a1 = K blez $a1, exit # 如果K<=0,直接退出(避免无效输入) # 提示用户输入序列 li $v0, 4 la $a0, prompt_seq syscall # 初始化变量 move $t0, $zero # $t0: 当前窗口内的元素计数 move $t1, $zero # $t1: 当前窗口的和(你定义的$S) # 在栈上分配K个整数的空间,用来存储最近的K个元素 subu $sp, $sp, 4 sw $a1, ($sp) # 先把K存在栈顶,后续释放空间时用 subu $sp, $sp, 4*$a1 # 分配K*4字节的数组空间 move $t3, $sp # $t3: 数组的起始地址 move $t4, $zero # $t4: 数组的当前索引(循环使用,模K) read_seq: # 读取序列中的一个整数 li $v0, 5 syscall beq $v0, $zero, exit # 输入0,结束程序 # 将当前元素存入数组对应位置 sll $t5, $t4, 2 # 计算字节偏移:索引*4 add $t5, $t5, $t3 # 得到元素的存储地址 sw $v0, ($t5) # 存入当前元素 # 累加当前元素到窗口和 add $t1, $t1, $v0 addi $t0, $t0, 1 # 窗口元素计数+1 # 判断窗口是否已满(达到K个元素) bne $t0, $a1, read_seq # 没满,继续读下一个元素 # 窗口已满,输出当前和 jal print_sum # 进入滑动窗口逻辑:每次读新元素,更新窗口和并输出 slide_window: # 读取下一个元素 li $v0, 5 syscall beq $v0, $zero, exit # 输入0,结束程序 # 取出数组中最早加入窗口的元素(当前索引对应的位置) sll $t5, $t4, 2 add $t5, $t5, $t3 lw $t6, ($t5) # $t6 = 窗口中最老的元素 # 更新窗口和:减去最老元素,加上新元素 sub $t1, $t1, $t6 add $t1, $t1, $v0 # 替换数组中的老元素为新元素 sw $v0, ($t5) # 更新数组索引(循环模K,实现队列的FIFO) addi $t4, $t4, 1 rem $t4, $t4, $a1 # 输出更新后的窗口和 jal print_sum # 继续处理下一个元素 j slide_window print_sum: # 输出当前窗口和 li $v0, 1 move $a0, $t1 syscall # 输出空格分隔结果 li $v0, 4 la $a0, space syscall jr $ra exit: # 释放栈上分配的空间 lw $a1, 4($sp) # 取出之前存储的K值 addu $sp, $sp, 4*$a1 # 释放数组空间 addu $sp, $sp, 4 # 释放存储K的空间 # 退出程序 li $v0, 10 syscall
关键部分解释
- 输入合法性检查:加了
blez $a1, exit,避免用户输入K≤0的无效情况,防止后续逻辑出错。 - 滑动窗口实现:用栈上的数组存储最近K个元素,通过循环索引(模K)来实现“先进先出”的队列效果,这样每次滑动时能快速找到要移除的老元素。
- 代码复用:把输出和的逻辑封装成
print_sum函数,减少重复代码,让结构更清晰。 - 栈空间管理:手动分配和释放栈空间,避免内存泄漏,符合MIPS汇编的规范。
针对你原来的代码,我保留了你定义的$K对应$a1、$S对应$t1的映射,同时补全了从输入处理到滑动窗口计算的完整逻辑。
内容的提问来源于stack exchange,提问作者JusTRoll
相关产品推荐
相关产品推荐

