Мне нужно написать сортировку слиянием для моего класса в 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