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.3
和 str2: 123.41
)
因此,您可能需要一些代码来预先对齐两个数字的小数点。
我正在尝试添加以 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.3
和 str2: 123.41
)
因此,您可能需要一些代码来预先对齐两个数字的小数点。