请求完善遍历链表并实现十进制转四进制的MIPS程序
MIPS链表遍历与十进制转四进制输出程序完善
我需要实现一个MIPS程序,完成以下功能:
- 遍历给定的链表
- 将链表中的每个整数从十进制转换为四进制并输出到屏幕
- 同时保留现有代码中计算链表总和、以及能被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
相关产品推荐
相关产品推荐

