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
相关产品推荐
相关产品推荐

