#arrays #mips #mips64
Вопрос:
.globl insertion_sort
.globl main
.data
arr: .word 4 3 9 2 1 #array for testing
.text
main:
#Load array address
addi $at,$0,0x10010000
addi $a0,$at, 0
#Call function
jal insertion_sort
#Call function to get length of the array
jal len
add $t0,$0,$v0
add $s0,$0,$a0
#Display loop
printLoop:
sle $t7,$t0,0
beq $t7,1,exit
#Display each digit
lw $a0,($s0)
addi $v0,$0,1
syscall
addi $a0,$0,32
addi $v0,$0,11
syscall
#Increment array address
addi $s0,$s0,4
#loop decrement
addi $t0,$t0,-1
j printLoop
#Exit program
exit:
addi $v0,$0,10
syscall
insertion_sort:
#Array address
add $s0,$0,$a0
#return address
add $s1,$0,$ra
#Call function to get size of the array
jal len
#array size
add $t0,$0,$v0
#Array address increment
addi $s0,$s0,4
addi $t6,$0,1 #i=1
#Outer loop
loopSort:
sge $t7,$t6,$t0
beq $t7,1,retSort
lw $t2,($s0)
#Array address
add $t1,$0,$s0
addi $t3,$t6,-1 #j
innerLoop:
slt $t7, $t3,$0 #j>=0
beq $t7,1,next
addi $t1,$t1,-4
lw $t4,($t1) #list[j]
sge $t7,$t2,$t4 #key<list[j]
beq $t7,1,next
add $t5,$t1,$0
addi $t5,$t5,4 #j 1
sw $t4,($t5) #list[j 1]=list[j]
addi $t3,$t3,-1
j innerLoop
next:
addi $t5,$t5,-4 #list[j 1]=key
sw $t2,($t5)
addi $s0,$s0,4 #i
addi $t6,$t6,1
j loopSort
#Return to main
retSort:
add $ra,$0,$s1
jr $ra
len:
addi $v0,$0,0
addi $t2,$a0, 0
lenLoop:
lw $t3,($t2) <====== RUNTIME EXCEPTION AT THIS LINE !!!
#Check empty
beq $t3,'',retLen
addi $v0,$v0,1
#array address increment
addi $t2,$t2,4
j lenLoop
retLen:
jr $ra
Строка, отмеченная мной, создает следующее исключение во время выполнения:
Ошибка в /home/task4.asm строка 90: Исключение во время выполнения при 0x00400248: адрес выборки не выровнен по границе слова 0x1001000f
Я знаю, что что-то не так при хранении массива
адрес, но я не знаю, как это исправить. Ценю вашу помощь!!
Комментарии:
1. Вы пытались его отладить? Используйте один шаг и посмотрите, где все пойдет не так. Очевидно, что 0x1001000f-это неправильный адрес для элемента word массива, поэтому посмотрите, кто создал это значение, и исправьте его. К вашему сведению, первый элемент массива равен 0x10010000, а второй-0x10010004 и так далее, кратно 4.