MIPS十六进制转十进制程序调试求助:输出异常负数与最大值错误
MIPS十六进制转十进制转换器调试求助
我正在编写一款MIPS十六进制转十进制转换器,程序需从命令行接收最多8个以0x开头、4字节长且以空字符结尾的十六进制字符串参数,$s1存储参数数量,$s0指向参数列表起始位置。
使用测试参数0x1A、0xF1、0x0B3运行时,程序输出出现异常:Integer values显示为-2121474836290,Maximum value显示为0,而正确结果应为26、241、179,最大值为241。
现附上程序代码,请求协助调试解决问题:
.data buffer: .space 32 args: .asciiz "\nProgram arguments:\n" space: .asciiz " " d_rep: .asciiz "\n\nInteger values:\n" newLine: .asciiz "\n" maxVal: .asciiz "Maximum value:\n" .text main: add $t9, $zero, $zero # t9 will be max value add $s1, $a0, $0 # store number of program arguments add $s2, $a1, $0 # store address of where program arguments are addi $s0, $0, 0 # use s0 as index for looping addi $s7, $zero, 0 # used as index for print loop add $s6, $s1, $0 # store numArgs for printloop add $s5, $s2, $0 # store address for printloop addi $t5, $zero, 16 addi $t6, $zero, 0 la $a0, args # load and print "Program arguments" string li $v0, 4 # print syscall printloop: beq $s7, $s6, printInt # only print as many times as there are args lw $a0, 0($s5) # get the first word li $v0, 4 # print syscall la $a0, space # print a space between words li $v0, 4 # print syscall addi $s5, $s5, 4 # increment to next word addi $s7, $s7, 1 # increment printloop counter j printloop # loop again if there are more args printInt: la $a0, d_rep # print "Decimal values:" li $v0, 4 # print syscall while: beq $s0, $s1, done # while $s0 <= numArgs lb $t1, 2($s2) # load s2[2] into addu $t2, $zero, $t1 # make a copy so we dont lose place subiu $sp, $sp, 4 convert: beqz $t2, postConv # while t2 != null blt $t2, 65, convNumber # if less than value of A then got a num subiu $t3, $t2, 0x37 # -55 for uppercase letter sll $t3, $t3, 4 # sll by 4 is same as mult by 16 sw $t3, ($sp) # store word to do some addition addiu $t2, $t2, 1 # increment t2 subiu $sp, $sp, 4 # increment sp j convert # go back to convert convNumber: addu $t3, $zero, $t2 # put t2 into t3 for to do some math subiu $t3, $t3, 0x30 # -48 for number sll $t3, $t3, 4 # sll by 4 is same as mult by 16 sw $t3, ($sp) addiu $t2, $t2, 1 # increment t1 addiu $sp, $sp, 4 # increment sp j convert # jump back to convert postConv: addi $sp, $sp, 4 # load the second value lw $s4, ($sp) # load the first value addi $sp, $sp, 4 # sll $s4, $s4, 4 lw $s3 ($sp) addu $s3, $s3, $s4 # add em up for converted decimal move $a0, $s3 # move to a0 so they pint li $v0, 1 # print syscall addiu $s0, $s0, 1 # increment loop counter addiu $s2, $s2, 4 # increment to next word ble $t9, $t6, newMax # check for a new max value j while # jump back to loop newMax: addu $t9, $zero, $t6 # got a new max so save it j while done: la, $a0, newLine li $v0, 4 syscall la, $a0, newLine li $v0, 4 syscall la, $a0, maxVal li $v0, 4 syscall move $a0, $t9 li $v0, 1 syscall la, $a0, newLine li $v0, 4 syscall li $v0, 10 # end program syscall
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

