Создание слияния в QTSpim - PullRequest
0 голосов
/ 29 марта 2020

Мне нужно написать сортировку слиянием для моего класса в QTSpim. Все еще выясняю сборку и насколько это страшный сон. Я надеялся, что все мои проблемы будут пытаться заставить подпрограмму работать, но у меня все еще есть проблемы с хранением входных данных от пользователя.

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

** edit:

@ Шут, да, конечно, не хотел писать эссе, поэтому я продолжал это коротко, но было бы полезно перечислить проблемы. Запуск программы построчно, она попадает в хранилище l oop, но выдаст ошибку примерно через 4-5 циклов.

Возникла исключительная ситуация на ПК = 0x004000d0 Не выровненный адрес в inst / data fetch: 0x73656c62

Моя логика c в l oop состояла в том, чтобы просто циклически проходить и перемещать адрес вверх на 4 каждый раз и просто сохранять пользовательский ввод в регистр 13. Я думал, что это будет просто и я использовал тот же метод в моем последнем назначении. Не уверен, что отличается в этот раз.

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

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

    .data
    spacer:     .asciiz ", "                #used to make the output look nicer
    intro:      .asciiz "Enter the total number of inputs (must be a power of 2): "
    storeQuote: .asciiz "Enter the variables: "
    list2:      .word 0
    list:       .word 0
    .text
    .globl main

main:
    li      $v0, 4          #output intro
    la      $a0, intro
    syscall

    li      $v0, 5          #get input of size
    syscall

    add     $12, $v0, $zero     #storing total size in $12
    add     $8, $v0, $zero      #storing total size once again

    li      $v0, 4          #output prompt for user to input variables
    la      $a0, storeQuote
    syscall

    mul     $15, $12, -4    #multiplying for address value moved

    la      $13, list2
    la      $a0, spacer

store:
    li      $v0, 5          #get input of size
    syscall

    sw      $v0, 0($13)     #storing input to $13
    addi    $13, $13, 4     #moving pointer

    li      $v0, 4          #for formating on console
    syscall

    addi    $12, $12, -1    #loop counter subtraction
    bgt     $12, $v0, store #loop close 

main2:
    add     $13, $13, $15   #resetting pointer to zero
    addi    $14, $0, 4      #initial pointer move value for the loop
    addi    $24, $24, 1


firstloop:
    j       secondloop
    srl     $8, $8, 1       #diving total size by 2
    beq     $8, $24, fin    #if the set of lists is 1, jump to finish
    add     $9, $0, $8      #storing the loop counter for second loop
    sll     $15, $15, 2     #doubling the pointer move value for loop

secondloop:
    add     $14, $13, $8
    lw      $14, 0($14)
    jal     mergesub        #jump and link
    add     $13, $13, $15   #moving the pointer value
    addi    $9, $9, -1
    bnez    $9, secondloop
    j       firstloop

mergesub:
    lw      $10, 0($13)                     #loading a certain single variable from the array into a register to be compared
    lw      $11, 0($14)
    beq     $13, $16, function2             #used to end the loop if arrays have come to an end
    beq     $14, $17, function1
    beq     $10, $11, function1
    blt     $10, $11, function1             #the statements that determine if one variable in either array is less than
    bgt     $10, $11, function2             #the other and goes to its respective function to output

function1:
    beq     $13, $16, fin                   #part 2 of the check to see if the arrays are done
    sw      $10, 0($13)                     #storing the the lesser value into the output array
    addi    $13, $13, 4
    jr      $ra                             #goes back to loop

function2:
    beq     $14, $17, fin                   #does the same thing as function one but if the second array value was lesser
    sw      $11, 0($13)                     #value than the first array value
    addi    $14, $14, 4
    jr      $ra

fin:
    la      $v0, 10                         #ending the program
    syscall
...