QTSpim MIPS程序帮助。从ascii字符串转换为整数时编程错误

时间:2012-11-10 18:39:26

标签: assembly mips

我正在开发一个mips程序,用于将ascii字符串中的数字转换为整数,其参数应该接受正整数和负整数十进制字符串。我知道这是一个非常常见的任务,但我无法在线解决我的问题。我能够获得一些提示,但在尝试运行程序时仍然收到错误。

这是我目前的代码:

main:    # convert string to integer
li $t6, 0x00    # $t6 = 0
li $t7, 0x09    # $t7 = 9
li $v0, 0x00    # initialize $v0 = 0
move $t0, $a0   # $t0 = pointer to string
lb $t1, ($t0)   # load $t1 = digit character

loop:
blt $t1, $t6, Done  # char < 0
bgt $t1, $t7, Done  # char > 9
subu $t1, $t1, $t6   # convert char to int
mul $v0, $v0, 10    # multiply by 10
add $v0, $v0, $t1   # $v0 = $v0 * 10 + digit
addiu $t0, $t0, 1   # point to next char
lb $t1, ($t0)        # load $t1 = next digit
bne $t1, $0, loop   # repeat if not end of string
jr $ra   # return integer

Done:          #exit program if string not a number
li $v0, -1      # return -1 in $v0
jr $ra

我在尝试运行此操作时遇到了大量错误,我只是不知道为什么。这是我第一次用mips写作,所以我对它没有感觉。有小费吗?谢谢!

我确实修复了我能理解的错误。我所在的地区没有TA,也没有可用的导师。如果可能的话,我真的很想帮助理解这一点。我会喜欢一些有建设性的回复。

1 个答案:

答案 0 :(得分:1)

您提供的代码尝试将无符号(正)整数从asciiz缓冲区转换为整数。 它失败了,因为你为数字'0和'9'提供了错误的常量。 ASCII表中的“0”使用代码0x30,“9”使用代码0x39,或者只使用“0”和“9”来加载这些中间名。

因此,要修复程序,您应该使用:

li $t6, '0'    # $t6 = 0x30
li $t7, '9'    # $t7 = 0x39

要允许例程正确解析负整数,您需要:

  • 读取第一个输入字符以查看它是否为减号' - ',也可以在某些未使用的寄存器中设置此比较的结果。如果是负数,则将指针移动到下一个char
  • 现在继续像你一样解析字符串,除非你必须考虑数字是否为负数。如果该数字为负数而非发布$v0 = $v0 * 10 + digit,则应发出$v0 = $v0 * 10 - digit