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

