Метод сортировки / обмена в QtSpim, возвращающий неизвестную ошибку - PullRequest
0 голосов
/ 01 мая 2018

Это мой первый раз, когда я работаю со сборкой, поэтому я не уверен, с чего начать, когда идет поиск неисправностей. Программа ниже предназначена для сортировки массива. Я считаю, что мои методы подкачки и сортировки верны, но я уверен, что основной метод сделан неправильно.

.data
array1: .word 2, 1, 3, 5, 4

.text
.globl main
main:
    # Initialize Registers
    lw  $a0, x      # Reg $a0 = x
    lw  $a1, y      # Reg $a1 = y

    # Call function
    move    $a0, $a0
    jal     sort
    move    $a1, $v0

    # print mag1
    li  $v0, 4
    la  $a0, mag1
    syscall

    # print result (y)
    li  $v0, 1
    move    $a0, $a1
    syscall

    # print newline
    li  $v0, 4
    la  $a0, lf
    syscall

    # Exit
    li  $v0, 10
    syscall

sort:   
    addi $sp, $sp, -20
    sw $ra, 16($sp)
    sw $s3, 12($sp)
    sw $s2, 8($sp)
    sw $s1, 4($sp)
    sw $s0, 0($sp)

    move $s2, $a0
    move $s3, $a1
    move $s0, $zero

loop1:  
    slt $t0, $s0, $s3
    beq $t0, $zero, exit1
    addi $s1, $s0, -1

loop2:  
    slti $t0, $s1, 0
    bne $t0, $zero, exit2
    sll $t1, $s1, 2
    add $t2, $s2, $t1
    lw $t3, 0($t2)
    lw $t4, 4($t2)
    slt $t0, $t4, $t3
    beq $t0, $zero, exit2
    move $a0, $s2
    move $a1, $s1
    jal swap
    addi $s1, $s1, -1
    j loop2

exit2:  
    addi $s0, $s0, 1
    j loop1

exit1:  
    lw $s0, 0($sp)
    lw $s1, 4($sp)
    lw $s2, 8($sp)
    lw $s3,12($sp)
    lw $ra,16($sp)
    addi $sp, $sp, 20
    jr $ra

swap:   
    sll     $t1, $a1, 2
    add     $t1, $a0, $t1   

    lw      $t0, 0($t1)         
    lw      $t2, 4($t1)         

    sw      $t2, 0($t1)         
    sw      $t0, 4($t1)         

    jr      $ra     

Затем код возвращает следующую ошибку:

Instructions reference undefined symbol at 0x00400024 [0x00400024] ;8: lw 

$a0, x # Reg $a0 = x 

Кажется, это проблема с определением переменной x, что означает, что то же самое, вероятно, произойдет с переменной y. В чем проблема и как я могу ее решить?

редактирование:

Updated code
.data
x: .word 4
y: .word 5


.text
.globl main
main:
    # Initialize Registers
    lw  $a0, x      # Reg $a0 = x
    lw  $a1, y      # Reg $a1 = y

    # Call function
    move    $a0, $a0
    jal     sort
    move    $a1, $v0

    # print mag1
    li  $v0, 4
    la  $a0, mag1
    syscall

    # print result (y)
    li  $v0, 1
    move    $a0, $a1
    syscall

    # print newline
    li  $v0, 4
    la  $a0, lf
    syscall

    # Exit
    li  $v0, 10
    syscall

sort:   
    addi $sp, $sp, -20
    sw $ra, 16($sp)
    sw $s3, 12($sp)
    sw $s2, 8($sp)
    sw $s1, 4($sp)
    sw $s0, 0($sp)

    move $s2, $a0
    move $s3, $a1
    move $s0, $zero

loop1:  
    slt $t0, $s0, $s3
    beq $t0, $zero, exit1
    addi $s1, $s0, -1

loop2:  
    slti $t0, $s1, 0
    bne $t0, $zero, exit2
    sll $t1, $s1, 2
    add $t2, $s2, $t1
    lw $t3, 0($t2)
    lw $t4, 4($t2)
    slt $t0, $t4, $t3
    beq $t0, $zero, exit2
    move $a0, $s2
    move $a1, $s1
    jal swap
    addi $s1, $s1, -1
    j loop2

exit2:  
    addi $s0, $s0, 1
    j loop1

exit1:  
    lw $s0, 0($sp)
    lw $s1, 4($sp)
    lw $s2, 8($sp)
    lw $s3,12($sp)
    lw $ra,16($sp)
    addi $sp, $sp, 20
    jr $ra

swap:   
    sll     $t1, $a1, 2
    add     $t1, $a0, $t1   

    lw      $t0, 0($t1)         
    lw      $t2, 4($t1)         

    sw      $t2, 0($t1)         
    sw      $t0, 4($t1)         

    jr      $ra                 
...