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

MIPS汇编整数转十六进制时10转换为0x:而非0xa问题求助

问题原因排查

  • 字符转换分支判断错误
    你当前代码判断ble $t0, 10, lessThanTen,当$t0等于10时会进入数字分支,10+48=58对应ASCII字符:,这是输入10输出0x:的直接原因。正确判断应为小于等于9时进入数字分支,10及以上进入字母分支,修改为ble $t0, 9, lessThanTen。
  • 字符串无终止符
    MIPS打印字符串的系统调用syscall 4要求目标字符串以\0(ASCII 0)结尾,你当前未在转换结果末尾添加终止符,可能出现打印乱码。
  • 多位十六进制输出顺序颠倒(未触发的隐藏问题)
    当前转换逻辑每次取最低4位直接写入缓冲区,会导致低位在前高位在后,比如输入26(0x1a)会输出0xa1,不符合常规十六进制书写顺序,若需支持多位转换可额外添加逆序处理逻辑。
  • 指针冗余偏移(不影响当前结果但逻辑冗余)
    main中写入0x后已经将$a1加1指向answer[1],进入print_hex后再次加1才指向answer[2],可以直接在main中调整指针到answer[2],减少一次冗余运算。

修复后代码(已解决输入10输出异常问题)

.data
prompt1: .asciiz "\nEnter an integer number: "
answer: .space 8
.text
.globl main

main:
        la $a0, prompt1     # 提示用户输入整数
        li $v0, 4
        syscall

        la $a1, answer      # 加载answer缓冲区地址
        addi $t0, $zero, 48 # 写入前缀'0'
        sb $t0, 0($a1)
        addi $t0, $0, 120   # 写入前缀'x'
        sb $t0, 1($a1)
        addi $a1, $a1, 2    # 直接调整指针到前缀后的第一个可写位置,对应answer[2]

        li $v0, 5           # 读取用户输入整数
        syscall
        add $a0, $v0, $zero
        jal print_hex

        la $a0, answer
        li $v0, 4
        syscall             # 打印转换结果

        j main


print_hex:
        andi $t0, $a0, 0xf

        ble $t0, 9, lessThanTen        
        addi $t0, $t0, 39   # 10~15转换为a~f的ASCII偏移
    lessThanTen:
        addi $t0, $t0, 48   # 0~9转换为0~9的ASCII偏移
        sb $t0, 0($a1)
        addi $a1, $a1, 1    # 写入后指针后移
        srl $a0, $a0, 4
        bne $a0, $zero, print_hex

        sb $zero, 0($a1)    # 写入字符串终止符
    done:
        jr $ra

内容的提问来源于stack exchange,提问作者saksak chuwawa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:54:03