2016-11-12 12 views
0

этот код mips для heapsort. Когда я пытаюсь запустить его, я получаю следующие сообщения об ошибках Синтаксическая ошибка в строке 149 (массив: .word 54,23,56,32,99,7,4,2,88,9,11,21,39, 55,100,101,43,1,3,69, -5, -24, -17,0) и еще один символ инструкции не определен в строке 14. Я уже много раз смотрю на него, и я до сих пор не вижу ошибок , Пожалуйста, дайте мне знать, если найдете. это код:этот код не будет работать на Qtspim

.text 
.globl main 
main: 

    la $a0, array # a0 = &array 

    la $t0, size 
    lw $a1, 0($t0) # a1 = size(array) 

    jal heapsort 

    # print the array 
    move $t0, $a0 
    add $t1, $zero, $zero 
printloop: 
    li $v0, 1 
    lw $a0, 0($t0) 
    addi $t0, $t0, 4 
    addi $t1, $t1, 1 
    syscall 
    li $v0, 4 
    la $a0, space 
    syscall 

    bne $t1, $a1, printloop # while(t1 != size) 
    li $v0, 4 
    la $a0, newline 
    syscall 

done: 
    jr $ra 

heapsort: # a0 = &array, a1 = size(array) 
    addi $sp, $sp, -8 
    sw $a1, 0($sp) # save size 
    sw $a2, 4($sp) # save a2 
    sw $ra, 8($sp) # save return address 


    move $a2, $a1 # n will be stored in a2 
    addi $a2, $a2, -1 # n = size - 1 
    ble $a2,$zero, end_heapsort # if (n <= 0) return; 

    jal make_heap # a0 = arr, a1 = size 

    add $a1, $zero, $zero # clear $a1 
heapsort_loop: 
    # swap(array[0],array[n]) 
    lw $t0, 0($a0) 
    sll $t1, $a2, 2 #t1 = bytes(n) 
    add $t1, $t1, $a0 
    lw $t2, 0($t1) 
    sw $t0, 0($t1) 
    sw $t2, 0($a0) 

    addi $a2, $a2, -1 # n-- 
    jal bubble_down # a0 = &array, a1 = 0, a2 = n 

    bnez $a2, heapsort_loop 
end_heapsort: 
    lw $ra, 8($sp) 
    lw $a2, 4($sp) 
    lw $a1, 0($sp) 
    addi $sp, $sp, 8 
    jr $ra 

make_heap: # a0 = &array, a1 = size 
    addi $sp, $sp, -12 
    sw $a1, 0($sp) 
    sw $a2, 4($sp) 
    sw $ra, 8($sp) 

    addi $a2, $a1, -1 # a2 = size - 1 

    addi $a1, $a1, -1 # start_index = size - 1 
    srl $a1, $a1, 1 # start_index /= 2 

    blt $a1, $zero, end_make_heap # if(start_index < 0) return 

make_heap_loop: 
    jal bubble_down # a0 = &array, a1 = start_index, a2 = size-1 
    addi $a1, $a1, -1 
    ble $zero, $a1, make_heap_loop 

end_make_heap: 
    lw $ra, 8($sp) 
    lw $a2, 4($sp) 
    lw $a1, 0($sp) 
    addi $sp, $sp, 12 
    jr $ra 

#bubble_down is a leaf in the call graph 
bubble_down: # a0 = &array, a1 = s_idx, a2 = end 
    move $t0, $a1 # index = s_idx 
    sll $t1, $t0, 2 # child = index*2+1 
    addi $t1, $t1, 1 

    bgt $t1, $a2, end_bubble_down 

bubble_down_loop: 

    #if (child < end && arr[child] < arr[child+1]) 
    ble $a2, $t1, skipinc 
    sll $t3, $t1, 2 # get bytes(child) 
    add $t3, $t3, $a0 
    lw $t3, 0($t3) # t3 = arr[child] 
    sll $t4, $t1, 2 #get bytes(child) 
    addi $t4, $t4, 4 #t4 = bytes(child+1) 
    add $t4, $t4, $a0 
    lw $t4, 0($t4) #t4 = arr[child+1] 
    ble $t4, $t3, skipinc 

    addi $t1, $t1, 1 # child++ 

skipinc: 
    sll $t3, $t0, 2 # get bytes(index) 
    add $t3, $t3, $a0 
    lw $t4, 0($t3) #t4 = arr[index], t3 = &arr[index] 

    sll $t5, $t1, 2 # get bytes(child) 
    add $t5, $t5, $a0 
    lw $t6, 0($t5) #t6 = arr[child], t5 = &arr[child] 

    ble $t6, $t4, end_bubble_down 

    # swap(arr[index],arr[child] 
    # note: t4 = arr[index], t6 = arr[child], t3 = &arr[index], t5 = &arr[child] 
    sw $t4, 0($t5) 
    sw $t6, 0($t3) 

    move $t0, $t1 # index = child 

    sll $t1, $t0, 1 # child = index*2+1 
    addi $t1, $t1, 1 
    ble $t1, $a2, bubble_down_loop 

end_bubble_down: 
    jr $ra 

.data 
# the array that holds unordered data 
array: .word 54,23,56,32,99,7,4,2,88,9,11,21,39,55,100,101,43,1,3,69,-5,-24,-17,0 
size: .word 24 
space: .asciiz " " 
newline: .asciiz "\n" 
+0

Возможно, он не знает о '$ zero', попробуйте вместо этого использовать' $ 0'. Что касается другой ошибки, если она действительно находится на этой строке (то, что вы вставили только 146 строк), 'array' может быть зарезервированным словом, попробуйте использовать что-то еще. – Jester

+0

Спасибо, я внес эти изменения. Надеюсь, он побежит. – TINA15

+0

Ох, все еще есть одно и то же сообщение. Кажется, ничего не изменилось. Любые идеи, пожалуйста ??? – TINA15

ответ

0

Я не могу воспроизвести ошибку, вы можете описать с QtSpim 9.1.12 для Windows. Таким образом, вы используете другую версию QtSpim, которая ведет себя по-другому и/или не выполняет точный код, который вы нам показали, и/или не повторно инициализировал симулятор, прежде чем перезагружать код сборки.

Вы do однако имеют ошибку в вашем коде. Ну, может быть, более одного, но, по крайней мере, одного, что было очевидно:

В done: вы пытаетесь завершить свою программу с помощью jr $ra. Тем не менее, вы изменили значение $ra на jal heapsort, не сохраняя его. Итак, что происходит с последним jr $ra, так это то, что вы вернетесь к печатающему коду, который затем будет выполнен снова. И первое, что вы там делаете, - $t0 = $a0, где $a0 должен содержать адрес array. Но $a0 больше не содержит адрес массива, потому что перед jr $ra вы сделали la $a0, newline.

TL; DR: Всякий раз, когда вы делаете jal, вы изменяете $ra. Если вам нужно предыдущее значение $ra в какой-то более поздний момент, вам необходимо его сохранить (в другом регистре, в переменной памяти или в стеке).

1

Ошибка синтаксиса может быть исправлено путем ввода пробела после каждого "" в .word массива: так "54, 23, 56, 32, 99, 7, 4, 2, ..."

+0

Спасибо. Не видел этого. Обязательно сделаю это, и я надеюсь, что код будет работать на этот раз. :) – TINA15

+0

привет там. Я внес изменения, и я уверен, что это было правильное изменение. (спасибо за это), но я до сих пор получаю это сообщение об ошибке, когда пытаюсь запустить код «указание команды undefined symbol на 0x0040002c [0x0040002c] 0x3c010000 lui $ 1, 0 [размер]; 14: la $ t0, размер. можете ли вы сказать мне что это значит, я снова и снова просматривал, но я не вижу, где проблема. спасибо – TINA15

+0

или любой другой человек. – TINA15