我正在尝试添加基数为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
答案 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
)
因此,您可能需要一些代码来预先将两个数字相对于它们的小数点对齐。