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

MIPS汇编整数转十六进制报错求助:输出大量48字符

问题分析与修复方案

核心错误点

  • 输出系统调用误用:你用li $v0, 1(整数输出)打印ASCII字符,导致$t3里的ASCII值(比如'0'对应的48)被当成整数输出,所以会看到大量数字48,而非字符'0'。应改用li $v0, 11(字符输出调用)。
  • 循环终止条件错误:beqz $t2, EndLoop会在$t2右移至0时提前结束循环,高位可能包含A-F的十六进制位根本没机会处理。MIPS是32位整数,必须固定循环8次才能覆盖所有8个十六进制位。
  • 移位逻辑冗余混乱:rol $t4, $t2, 4循环左移的操作没必要,直接提取$t2的最高4位更直观,避免循环移位带来的逻辑误差。

修复后的代码

.data
prompt: .asciiz "Please enter value: "
ans: .asciiz "Hex: "

.text
.globl main  # 修正原代码的.globl拼写错误
main:
    la $a0, prompt
    li $v0, 4
    syscall

    li $v0, 5
    syscall
    move $t2, $v0

    la $a0, ans
    li $v0, 4
    syscall

    li $t0, 8  # 固定循环8次,处理32位整数的所有十六进制位
Loop:
    srl $t4, $t2, 28  # 取出$t2的最高4位
    and $t3, $t4, 0xf  # 保留低四位,得到当前十六进制位的数值(0-15)

    ble $t3, 9, Add
    addi $t3, $t3, 55  # 10-15转为A-F的ASCII码(65-70)
    j Print
Add:
    addi $t3, $t3, 48  # 0-9转为0-9的ASCII码(48-57)

Print:
    li $v0, 11  # 使用字符输出系统调用
    move $a0, $t3
    syscall

    sll $t2, $t2, 4  # 左移4位,准备处理下一组四位
    addi $t0, $t0, -1
    bnez $t0, Loop  # 未处理完8位则继续循环

EndLoop:
    li $v0, 10
    syscall

关键代码说明

  • srl $t4, $t2, 28:将32位的$t2右移28位,把最高4位移到最低位,方便后续提取。
  • and $t3, $t4, 0xf:用0xf(二进制1111)做掩码,保留低四位,得到当前要处理的十六进制位数值。
  • li $v0, 11:调用字符输出功能,直接打印$t3中的ASCII字符,而非整数。
  • 固定循环8次:确保32位整数的每一组4位都被处理,不会因$t2提前为0而中断。

内容的提问来源于stack exchange,提问作者prod jetskiii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:12