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

MIPS Help. Load Byte error. Address out of range

我正在尝试添加以 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

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

但是,然后,您 "fall through" 到 next: [可能是错误的] 并递减 $s1 所以它的值为 0x1000ffff。然后,您执行 j loop 以便现在从 下方 .data 段(即不存在的内存)开始的地址一个字节处获取数据

这就是崩溃的根源。您可能需要在 ble 之后跳转到其他代码。

但是,同样,当您执行 beq $t3,'.',next 时,您会转到 next: 并递减 both 指针。除非您限制输入,否则无法保证 both $s1 and $s2 都指向 '.'同时,所以你只想减少其中之一。 (例如,假设您有 str: 12.3str2: 123.41

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