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

