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

MIPS汇编hexasc子程序开发求助:0-15转十六进制ASCII字符

解决MIPS hexasc子程序的ASCII转换问题

你的现有代码仅能正确处理0-9的数字转换,因为直接将输入值与'0'的ASCII码(48)相加,但对于10-15的数字,这样会得到':'到'?'的ASCII字符,不符合'A'-'F'的要求。以下是符合你要求的实现,全程不使用s0-s7、gp、sp、fp寄存器,仅使用允许的临时寄存器、参数寄存器和返回寄存器:

完整hexasc子程序实现

hexasc:
    slti    $t0, $a0, 10       ; 判断输入$a0是否小于10,是则$t0=1,否则$t0=0
    beq     $t0, $zero, to_letter ; 若$a0>=10,跳转到字母转换分支
    addi    $v0, $a0, 48       ; 0-9:加上48得到'0'-'9'的ASCII码
    jr      $ra                ; 返回调用者
to_letter:
    addi    $v0, $a0, 55       ; 10-15:加上55得到'A'-'F'的ASCII码(10+55=65='A')
    jr      $ra

代码说明

  • 使用slti(立即数小于比较)指令完成数字范围判断,结果存入临时寄存器$t0(属于t系列寄存器,不在你禁止使用的列表中)
  • 通过beq分支指令实现两种转换逻辑的分流:
    • 当输入为0-9时,直接加48('0'的ASCII值)得到对应数字字符
    • 当输入为10-15时,加55(因为'A'的ASCII是65,65-10=55)得到对应大写字母
  • 全程仅使用$a0(输入参数)、$v0(返回值)、$t0(临时判断),以及jr $ra完成返回(未修改ra寄存器,仅使用其存储的返回地址)

替换后的完整代码框架

# hexmain.asm
.text
main:
li  $a0,0       # change this to test different values
jal hexasc      # call hexasc
nop         # delay slot filler (just in case)  
move    $a0,$v0     # copy return value to argument register
li  $v0,11      # syscall with v0 = 11 will print out
syscall         # one byte from a0 to the Run I/O window
stop:   j   stop        # stop after one run
nop         # delay slot filler (just in case)
hexasc:
    slti    $t0, $a0, 10
    beq     $t0, $zero, to_letter
    addi    $v0, $a0, 48
    jr      $ra
to_letter:
    addi    $v0, $a0, 55
    jr      $ra

内容的提问来源于stack exchange,提问作者Bryan C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:15:55