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

请求完善遍历链表并实现十进制转四进制的MIPS程序

MIPS链表遍历与十进制转四进制输出程序完善

我需要实现一个MIPS程序,完成以下功能:

  1. 遍历给定的链表
  2. 将链表中的每个整数从十进制转换为四进制并输出到屏幕
  3. 同时保留现有代码中计算链表总和、以及能被4整除的正数之和的逻辑

以下是我已编写的部分代码,请求协助完善:

.data
num1: .word -8 , num3
num2: .word 1988 , 0
num3: .word -9034 , num5
num4: .word -100 , num2
num5: .word 1972 , num4


.globl main 
.text
main:  
la   $t1,num1
li   $s0,0      # sum of the linked list
li   $s1,0      # sum of divided by 4 and postivie in the list
li   $t3,0      # temp remainder for the div by 4
li   $t4,4
li   $t5,0      # counter how many words we enterted the stack

sumloop: 
beqz     $t1,exit
lw   $t0,0($t1) 
add  $s0,$s0,$t0    # adding to the sum the value in the current node
lw   $t1,4($t1)

### need your help here :)

blez     $t0,sumloop    # if negative or zero dont add to s1
div      $t0,$t4
mfhi     $t3
bnez     $t3,sumloop    # if the value isnt divided by 4 without remainder jump to sumloop
add  $s1,$s1,$t0
j    sumloop

exit:
move     $a0,$s0
li   $v0,1
syscall 

li   $a0,'\n'
li   $v0,11
syscall 

move     $a0,$s1
li   $v0,1
syscall

完善后的完整代码

.data
num1: .word -8 , num3
num2: .word 1988 , 0
num3: .word -9034 , num5
num4: .word -100 , num2
num5: .word 1972 , num4
newline: .asciiz "\n"
prefix: .asciiz "0o"   # 四进制前缀,可选

.globl main 
.text
main:  
la   $t1,num1
li   $s0,0      # sum of the linked list
li   $s1,0      # sum of divided by 4 and postivie in the list
li   $t3,0      # temp remainder for the div by 4
li   $t4,4
li   $t5,0      # counter how many words we enterted the stack

traverse_loop: 
beqz     $t1,exit_traverse
lw   $t0,0($t1) 
add  $s0,$s0,$t0    # 累加链表元素总和

# 调用四进制转换输出函数,打印当前节点的数值
move $a0, $t0
jal print_quaternary

# 处理能被4整除的正数求和逻辑
blez     $t0,next_node    # 负数或零跳过
div      $t0,$t4
mfhi     $t3
bnez     $t3,next_node    # 余数不为0则跳过
add  $s1,$s1,$t0

next_node:
lw   $t1,4($t1)
j    traverse_loop

exit_traverse:
# 输出链表总和的四进制形式
li   $v0,4
la   $a0, newline
syscall
li   $v0,4
la   $a0, prefix
syscall
move     $a0,$s0
jal print_quaternary

# 输出能被4整除的正数之和的四进制形式
li   $v0,4
la   $a0, newline
syscall
li   $v0,4
la   $a0, prefix
syscall
move     $a0,$s1
jal print_quaternary

# 程序正常退出
li $v0, 10
syscall

# 十进制转四进制输出函数
# 输入:$a0 = 待转换的整数
print_quaternary:
# 处理负数情况
bgez $a0, positive_case
li $v0, 11
li $a0, '-'
syscall
neg $a0, $a0

positive_case:
# 特殊处理输入为0的情况
beq $a0, $zero, print_zero

# 使用栈存储四进制余数
li $t6, 4
li $t7, 0   # 栈中元素计数

push_loop:
beq $a0, $zero, pop_loop
div $a0, $t6
mfhi $t8    # 获取当前余数
mflo $a0    # 更新商为新的被除数
addi $sp, $sp, -4
sw $t8, 0($sp)
addi $t7, $t7, 1
j push_loop

pop_loop:
beq $t7, $zero, end_print
lw $t8, 0($sp)
addi $sp, $sp, 4
addi $t8, $t8, '0'  # 转换为ASCII字符
li $v0, 11
move $a0, $t8
syscall
addi $t7, $t7, -1
j pop_loop

print_zero:
li $v0, 11
li $a0, '0'
syscall

end_print:
li $v0,4
la $a0, newline
syscall
jr $ra

关键完善点说明

  • 修复链表遍历逻辑:原代码中提前更新节点指针的位置错误,调整后确保每个节点的所有处理逻辑执行完毕后再切换到下一个节点。
  • 新增四进制转换函数:print_quaternary函数实现完整的十进制转四进制输出,包含:
    • 负数符号处理:先打印负号再取正转换
    • 零值特殊处理:直接输出'0'避免栈操作异常
    • 栈存储余数:通过栈逆序保存余数,弹出时得到正确的四进制顺序
  • 优化输出格式:添加换行符和可选的四进制前缀0o,让输出结构更清晰
  • 补充程序退出逻辑:添加li $v0,10系统调用确保程序正常终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:39:21