Исключение 4 на MIPS Bubbleort

Так что я должен написать программу Bubsort в MIPS, используя QtSpim для класса, но я получаю Exception 4 [Adress error in inst/data fetch], Я искал в других темах и использую .align 2 директива перед определением массива для 5 целых чисел, но он все еще не исправлен.

Вот код:

.text
.globl main

main:

la $t1, array       #sets the base adress of the array to t1

la $a0, in_prompt
li $v0, 4
syscall 

li $t2, 0       #init to 1
read_loop:

beq $t2, 5, read_key        #break if t2 = 5

la $a0, num_prompt
li $v0, 4
syscall         #"Give number"

#move $a0, $t2
#li $v0, 1
#syscall            #current number to be read

li $v0, 5       #read int. 5 times
syscall

sw $v0, ($t1)       #move input from v0 to the array
addi $t1, $t1, 4    #move t1 to the next position in the array
addi $t2, $t2, 1    #increment counter (t2) by 1
j read_loop

read_key:

la $a0, search_q
li $v0, 4
syscall         #print query prompt

li $v0, 5
syscall
move $t3, $v0       #number we're looking for (KEY)

move $a0, $t1       #array to pass as arguement


jal bubblesort

move $a0, $v0       #move into a0 the sorted array
move $a1, $t3       #move the KEY into a1 as arguement

jal binarysearch

move $t1, $a0       #move into t1 the array
move $t0, $a1       #move into t0 the KEY
move $t3, $v0       #move into t3 the result of binarySearch 

beq $t3, -1, not_found  #if key was not found

move $a0, $t0
li $v0, 1
syscall

la $a0, found_pr
li $v0, 4
syscall
j print_array 



not_found:
move $a0, $t0
li $v0, 1
syscall

la $a0, not_found_pr
li $v0, 4
syscall
j print_array 

 print_array:
li $t2, 1       #init to 1

 print_loop:
beq $t2, 5, EXIT

lw $a0, ($t1)
li $v0, 1
syscall

addi $t1, $t1, 4
addi $t2, $t2, 1
j print_loop

EXIT:
li $v0, 10
syscall

##############binarysearch#################
binarysearch:
addi $sp, $sp, -24      #reserve space for 6 elements
sw $a0, 0($sp)          #push a0 (array)into stack
sw $a1, 4($sp)          #push a1(KEY) into stack
sw $s0, 8($sp)          #push s0
sw $s1, 12($sp)         #push s1
sw $s2, 16($sp)         #push s2
sw $ra, 20($sp)         #push ra
sw $s3, 24($sp)         #push s3

li $s0, 0   #low = 0
li $s1, 4   #high = 4

while:  
bgt $s0, $s1, exit_search   #if low > high branch

move $a1, $s0           #move into a1 low
move $a2, $s1           #move into a2 high

jal calc_middle         #jump to calc_middle
move $s2, $v0           #move into s2 the return value of calc_middle

lw $a0, 0($sp)          #restore into a0 the 1st stack el(array)
lw $a1, 4($sp)          #restore into a1 the 2nd stack el(KEY)

add $a0, $a0, $s2       #move the array to middle

lw $s3, ($a0)           #load into s3 the a[middle]

beq $a1, $s3, exit_search_found     #break if KEY == a[middle] 
blt $a1, $s3, less_t_middle     #if the key is less than the middle element
addi $s0, $s2, 1                #if the key is greater than the     middle element set new low 
j while

less_t_middle:
addi $s1, $s2, -1       #new high
j while

 exit_search_found:
move $v0, $s2           #return found
lw $s0, 8($sp)
lw $s1, 12($sp)
lw $s2, 16($sp)
lw $ra, 20($sp)
addi $sp, $sp, 24
jr $ra

exit_search:
li $v0, -1          #return -1
lw $s0, 8($sp)
lw $s1, 12($sp)
lw $s2, 16($sp)
lw $ra, 20($sp)
addi $sp, $sp, 24
jr $ra

##############calc_middle##################

calc_middle:
add $a1, $a1, $a2
sra $a1, $a1, 1
move $v0, $a1
jr $ra


##############bubblesort###################
bubblesort:
addi $sp, $sp, -12
sw $s0, 0($sp)
sw $s1, 4($sp)
sw $s2, 8($sp)

li $s2, 4           #j = 5
li $s1, 0           #i = 0

outer_loop:
addi $s2, $s2, -1       #i = j - 1
blt $s2, $zero,  exit_sort
inner_loop:
bgt $s1, $s2, outer_loop    #if i > j - 1

lw $s3, 0($a0)          #load into s3 the a[i]
lw $s4, 4($a0)          #load into s4 the a[i+1]

bgt $s3, $s4, swap      #if a[i] > a[i+1]
addi $s1, $s1, 1        #i++
j inner_loop


swap:   move $s0, $s3           #tmp = a[i]
move $s3, $s4           #a[i] = a[i+1]
move $s4, $s0           #a[i+1] = tmp
addi $a0, $a0, 4        #point to the next element ????
addi $s1, $s1, 1        #i++
j inner_loop


exit_sort:
lw $s0, 0($sp)
lw $s1, 4($sp)
lw $s2, 8($sp)
addi $sp, $sp, 8
move $v0, $a0           #pass into v0 the sorted array
jr $ra

.data
.align 2
 array:     .space 20
in_prompt:  .asciiz "Enter 5 numbers:\n"
num_prompt: .asciiz "Give number: "         
search_q:   .asciiz "what are you looking for?\n"
not_found_pr:   .asciiz " not found in array: \n"
found_pr:   .asciiz " found in array: \n"

0 ответов

Другие вопросы по тегам