MIPS帮助。加载字节错误。地址超出范围

时间:2017-03-05 21:43:26

标签: mips mips32

我正在尝试添加基数为5的数字。

我应该以XXXXXX.XXXXX的形式提示用户输入2个单独的基数为5的数字,然后添加它们。

我当前的问题是,当我将最后一位数字加载到寄存器中时出现错误,因此我可以开始计算。

请帮忙!感谢

.data
str: .space 13 # XXXXXX.XXXXX hold 12 chars + 0x00
str2: .space 13
sum: .space 14

printstr: .space 13
printstr2: .space 13
printsum: .space 14

message1: .asciiz "Enter a base 5 number A: "
message2: .asciiz "Enter a base 5 number B: "
message3: .asciiz "Sum of A and B: "
newline: .asciiz "\n"

.text
main:
#get number A
li $v0, 4
la $a0, message1
syscall
li $v0, 8
li $a1, 13
la $a0, str
syscall
li $v0, 4
la $a0, newline
syscall
#get number B
li $v0, 4
la $a0, message2
syscall
li $v0, 8
li $a1, 13
la $a0, str2

syscall
li $v0, 4
la $a0, newline
syscall

#pointer to input string A
la $s1, str
addi $s1, $s1, 12
#pointer to input string A
la $s2, str2
addi $s2, $s2, 12
#pointer to sum
la $s3, sum
addi $s3, $s3, 13

#other variables
li $t0, 0        # inital carry is 0
li $t1, 1        # counter for looping through string
li $t2, 5        # base 5

loop:
lb $t3, ($s1)    ############################# PROBLEM HERE######
lb $t4, ($s2)    

beq $t3, '.', next
beq $t4, '.', next

subi $t3, $t3, 0x30
subi $t4, $t4, 0x30


add $t5, $t3, $t4

add $t5, $t5, $t0

div $t5, $t2

mflo $t0
mfhi $t5

addi $t5, $t5, 0x30
sb $t5, ($s3)

subi $s1, $s1, 1
subi $s2, $s2, 1
subi $s3, $s3, 1

addi $t1, $t1, 1
ble $t1, 13, loop

addi $t0, $t0, 0x30
sb $t0, ($s3)

next:
subi $s1, $s1, 1 
subi $s2, $s2, 1
#subi $s3, $s3, 1
addi $t1, $t1, 1
j loop

PRINT:   #print the sum

exit:
li $v0, 10
syscall

1 个答案:

答案 0 :(得分:1)

您设置$s1指向过去str并向后递减。您的loop:终止是ble $t1,13,loop。完成后,$s1指向.data部分的开头(即0x10010000)。

但是,然后,你“落到”next: [可能是错误的]并递减$s1所以它的值为0x1000ffff。然后,你执行j loop,因此获取现在来自.data段开头的以下一个字节的地址(即不存在的内存)

这是崩溃的根源。你可能需要在ble后继续跳转到其他代码。

但是,当你执行beq $t3,'.',next时,你会转到next:并递减两个指针。除非您限制输入,否则无法保证 {/ 1>} $s1同时指向$s2,因此你只想减少其中一个。 (例如,假设您有'.'str: 12.3

因此,您可能需要一些代码来预先将两个数字相对于它们的小数点对齐。