与数组的合并排序(在 MIPS 汇编器中)

发布于 2024-10-31 17:46:36 字数 9747 浏览 4 评论 0原文

该程序的目的是获取偶数个用户输入的整数并对它们进行排序(使用合并排序)。它将排序后的列表打印到屏幕上。程序首先获取设置的大小,然后询问整数。它将它们分成两个甚至独立的集合,并从这里按升序对它们进行排序。当两个集合都排序后,程序会将两个集合合并在一起形成最终的排序集合。然后将最终设置打印到屏幕上。 我得到的输出只是一个 0 的列表。不确定我的错误在哪里,可以用一些新的眼光。谢谢。

    .data
msg1:
    .asciiz "Please Enter the the total even number of integers in the list: "
    .align 2
msg2:
    .asciiz "\nPlease Enter an integer: "
    .align 2
msg3:
    .asciiz "\nSorted list of integers is: "
    .align 2
coma:
    .asciiz ", "
    .align 2
set1:
    .space 69
    .align 2
set2:
    .space 69
    .align 2
set3:
    .space 138
    .align 2

    .text
    .globl main
main:
#Get input for size of sortedSet, divide it in half to get size of two
#final sorted sets to merge and store them into arguements
    li $v0, 4
    la $a0, msg1                #prints message1 to screen
    syscall
    li $v0, 5
    syscall                 #inputed value is number of elements
    move $s3, $v0
    beqz $s3, main              #check if inputed value is greater than zero
    li $t2, 2
    div $s3, $t2                #divides size of final array by 2
    mflo $s4                #stores quotient as size of smaller arrays

Enter:
#Get input of each integer in the list, after each entered integer itterator is increased by 1.
#input will be saved into set1,when size is equal set1size input will be saved into set2.
    beq $t4, $s4, Enter2            #branch to set2 when set1 is full
    li $v0, 4
    la $a0, msg2
    syscall                 #print message2 to screen, taking input for set1
    li $v0, 5
    syscall                 #takes inputed user value
    move $a1, $v0               
    la $a0, set1
    move $t2, $t4
    sll $t2, $t2, 2             #times itterator by 4
    add $t1, $t2, $a0
    sw $a1, ($t1)               #stores user value as current element of set1
    addi $t4, $t4, 1            #$t4 is itterator for entering loop. Increase by 1 to move to next space in set1
    j Enter
Enter2:
    beq $t5, $s4, step          #branch to step after both sets are full
    li $v0, 4
    la $a0, msg2
    syscall                 #print message2 to screen, taking input for set2
    li $v0, 5
    syscall                 #takes inputed user value
    move $a1, $v0
    la $a0, set2
    move $t2, $t5
    sll $t2, $t2, 2             #times itterator by 4
    add $t1, $t2, $a0
    sw $a1, ($t1)               #stores user value as current element of set2
    addi $t5, $t5, 1            #$t5 is itterator for second entering loop. Increase by 1 to move to next spot in set2
    j Enter2

step:
#resets itterators for safety/to use again
    li $t4, 0
    li $t5, 0
sort:
#sort each individual list to create two sorted list in ascending order for the final
# merge-sort with two lists.
#first set
    beq $t4, $s4, next          #branch to next (second set) when itterator is equal to size of set1
    la $a0, set1                
    move $t2, $t4               #move current spot into $t2 to preserve itterator
    sll $t2, $t2, 2             # times by 4
    add $t1, $t2, $a0           #get address of first element
    lw $s1, ($t1)               #load first element into $s1
    move $t2, $t4               
    addi $t2, $t2, 1            #add 1 to itterator to get next element in set
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s2, ($t1)               #load next element in set to $s2
    bge $s1, $s2, switch            #if set1[$s1] >= set1[$s2] goto label switch
    addi $t4, $t4, 1            #add 1 to itterator
    j sort
switch:
    la $a0, set1                #switch set1[$s1] and set1[$s1+1]
    move $t2, $t4
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s2, ($t1)               #store $s2 into the $s1 spot
    move $t2, $t4               
    addi $t2, $t2, 1                
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into the $s2 spot
    addi $t4, $t4, 1            #add 1 to itterator
    j sort

next:
    beq $t5, $s4, merge         #branch to merge when itterator equals set2 size
    la $a0, set2                #load address of set2
    move $t2, $t5               #move itterator to $t2 to preserve it
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load element into $s1
    move $t2, $t5
    addi $t2, $t2, 1            #add 1 to itterator for next element
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s2, ($t1)               #load next element into $s2
    bge $s1, $s2, switch2           #if set2[$t5] >= set2[$t5+1] goto label switch2
    addi $t5, $t5, 1            #add 1 to itterator
    j next
switch2:
    la $a0, set2                #switch set2[$s2] and set2[$s2+1]
    move $t2, $t5               
    addi $t2, $t2, 1        
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into $s2 spot
    move $t2, $t5
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s2, ($t1)               #store $s2 into $s1 spot
    addi $t5, $t5, 1            #add 1 to itterator
    j next

merge:
#resets itterators for safety/to use again
    li $t4, 0               # = set1 itterator
    li $t5, 0               # = set2 itterator
    li $t7, 0               # = set3 itterator
while:
#while($s1 <= $s4 || $s2 <= $s4) do{
# if($s1 == $s4){ set3[$s3] = set2[$s2]; addi $s2, 1; addi $s3, 1;
#   j while}
# if($s2 == $s4){ set3[$s3] = set1[$s1]; addi $s1, 1; addi $s3, 1;
#   j while}
# if(set1[$s1] > set2[$s2]){ set3[$s3] = set1[$s1]; addi $s1, 1;}
# else{ set3[$s3] = set2[$s2]; addi $s2, 1;}
# addi $s3, 1;
#} return 
# break

    beq $t4, $s4, print         #1st part of while conditional, branch to print if $t4 = $s4
here:
    beq $t4, $s4, if1           #1st if statement, branch to if1 loop if $t4 = $s4
    beq $t5, $s4, if2           #2nd if statement, branch to if2 loop if %t5 = $s4

    la $a0, set1                #3rd if statement
    move $t2, $t4
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load first element from set1 into $s1
    la $a0, set2
    move $t2, $t5
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s2, ($t1)               #load first element from set2 into $s2
    slt $t6, $s2, $s1           #returns 1 if $s1 > $s2
    bnez $t6, if3               #if $t6 =/= 0, branch to if3 loop
    beqz $t6, else3             #if $t6 = 0, branch to else3 loop

if1:
#branch for $s1 == $s4
# set3[$t7] = set2[$t4];
    la $a0, set2                #load set2 address
    move $t2, $t4
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load element at $t4 in set2 to $s1
    la $a0, set3                #load set3
    move $t2, $t7
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into $t7 position in set3
    addi $t4, $t4, 1            #add 1 to $t4 itterator
    addi $t7, $t7, 1            #add 1 to $t7 itterator
    j while


if2:
#branch for $s2 == $s4
# set3[$t7] = set1[$t4];
    la $a0, set1                #load set1 address
    move $t2, $t4               #load itterator into $t2
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load element in position $t4 into $s1
    la $a0, set3                #load set3 address
    move $t2, $t7
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into position $t7 in set3
    addi $t4, $t4, 1            #move to next position in set1
    addi $t7, $t7, 1            #move to next position in set3
    j while

if3:
#branch for set1[$t4] > set2[$s2]
# set3[$t7] = set1[$t4];
    la $a0, set1                #load set1 address
    move $t2, $t4               #move set1 itterator
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load element at $t4 of set1 into $s1
    la $a0, set3                #load set3 address
    move $t2, $t7               #load set3 itterator
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into set3 at position $t7
    addi $t4, $t4, 1            #move to next position in set1
    addi $t7, $t7, 1            #move to next position in set3
    j while

else3:
#branch for set1[$s1] < set2[$t5]
# set3[$t7] = set2[$t5];
    la $a0, set2                #load set2 address
    move $t2, $t5               #move set2 itterator to $t2
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s2, ($t1)               #load element in position $t5 of set2 into $s2
    la $a0, set3                #load set3 address
    move $t2, $t7               #move set3 itterator
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s2, ($t1)               #store element $s2 into position $t7 in set3
    addi $t5, $t5, 1            #move to next position in set2
    addi $t7, $t7, 1            #move to next position in set3
    j while

print:
#itterate through sortedSet and print it to console then exit
    blt $t5, $s4, here          #go to label here if 2nd part of while conditional is not met
    li $v0, 4   
    la $a0, msg3                #load msg3
    syscall                 #print to screen
    la $t3, set3                #load addresss of set3
    move $t2, $s3               #move set3 size into $t2
    li $t7, 0               #load 0 into set3 itterator
print2:
    sll $t7, $t7, 2
    add $t1, $t7, $t3
    li $v0, 1
    lw $a0, ($t3)               #load element at position $t2 of set3 into $a0
    syscall                 #print to screen
    li $v0, 4
    la $a0, coma                #load address of coma
    syscall                 #print screen
    addi $t7, $t7, 1            #move to next element in set3
    addi $t2, $t2, -1           #subtract 1 from set3 size
    bnez $t2, print2            #if set3 size =/= 0, branch to print2

    li $v0, 10
    syscall                 #exit program

The purpose of the program is to take an even number of user inputed integers and sort them (using merge sort). It prints the sorted list to the screen. The program first takes the set size, then asks for the integers. It splits them into two even separate sets, and from here sorts them in ascending order. When both sets are sorted, the program will take merge both sets together in a final sorted set. The final set is then printed to the screen.
Output I'm getting is just a list of 0's. Not sure where my error is, could use some fresh eyes. Thanks.

    .data
msg1:
    .asciiz "Please Enter the the total even number of integers in the list: "
    .align 2
msg2:
    .asciiz "\nPlease Enter an integer: "
    .align 2
msg3:
    .asciiz "\nSorted list of integers is: "
    .align 2
coma:
    .asciiz ", "
    .align 2
set1:
    .space 69
    .align 2
set2:
    .space 69
    .align 2
set3:
    .space 138
    .align 2

    .text
    .globl main
main:
#Get input for size of sortedSet, divide it in half to get size of two
#final sorted sets to merge and store them into arguements
    li $v0, 4
    la $a0, msg1                #prints message1 to screen
    syscall
    li $v0, 5
    syscall                 #inputed value is number of elements
    move $s3, $v0
    beqz $s3, main              #check if inputed value is greater than zero
    li $t2, 2
    div $s3, $t2                #divides size of final array by 2
    mflo $s4                #stores quotient as size of smaller arrays

Enter:
#Get input of each integer in the list, after each entered integer itterator is increased by 1.
#input will be saved into set1,when size is equal set1size input will be saved into set2.
    beq $t4, $s4, Enter2            #branch to set2 when set1 is full
    li $v0, 4
    la $a0, msg2
    syscall                 #print message2 to screen, taking input for set1
    li $v0, 5
    syscall                 #takes inputed user value
    move $a1, $v0               
    la $a0, set1
    move $t2, $t4
    sll $t2, $t2, 2             #times itterator by 4
    add $t1, $t2, $a0
    sw $a1, ($t1)               #stores user value as current element of set1
    addi $t4, $t4, 1            #$t4 is itterator for entering loop. Increase by 1 to move to next space in set1
    j Enter
Enter2:
    beq $t5, $s4, step          #branch to step after both sets are full
    li $v0, 4
    la $a0, msg2
    syscall                 #print message2 to screen, taking input for set2
    li $v0, 5
    syscall                 #takes inputed user value
    move $a1, $v0
    la $a0, set2
    move $t2, $t5
    sll $t2, $t2, 2             #times itterator by 4
    add $t1, $t2, $a0
    sw $a1, ($t1)               #stores user value as current element of set2
    addi $t5, $t5, 1            #$t5 is itterator for second entering loop. Increase by 1 to move to next spot in set2
    j Enter2

step:
#resets itterators for safety/to use again
    li $t4, 0
    li $t5, 0
sort:
#sort each individual list to create two sorted list in ascending order for the final
# merge-sort with two lists.
#first set
    beq $t4, $s4, next          #branch to next (second set) when itterator is equal to size of set1
    la $a0, set1                
    move $t2, $t4               #move current spot into $t2 to preserve itterator
    sll $t2, $t2, 2             # times by 4
    add $t1, $t2, $a0           #get address of first element
    lw $s1, ($t1)               #load first element into $s1
    move $t2, $t4               
    addi $t2, $t2, 1            #add 1 to itterator to get next element in set
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s2, ($t1)               #load next element in set to $s2
    bge $s1, $s2, switch            #if set1[$s1] >= set1[$s2] goto label switch
    addi $t4, $t4, 1            #add 1 to itterator
    j sort
switch:
    la $a0, set1                #switch set1[$s1] and set1[$s1+1]
    move $t2, $t4
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s2, ($t1)               #store $s2 into the $s1 spot
    move $t2, $t4               
    addi $t2, $t2, 1                
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into the $s2 spot
    addi $t4, $t4, 1            #add 1 to itterator
    j sort

next:
    beq $t5, $s4, merge         #branch to merge when itterator equals set2 size
    la $a0, set2                #load address of set2
    move $t2, $t5               #move itterator to $t2 to preserve it
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load element into $s1
    move $t2, $t5
    addi $t2, $t2, 1            #add 1 to itterator for next element
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s2, ($t1)               #load next element into $s2
    bge $s1, $s2, switch2           #if set2[$t5] >= set2[$t5+1] goto label switch2
    addi $t5, $t5, 1            #add 1 to itterator
    j next
switch2:
    la $a0, set2                #switch set2[$s2] and set2[$s2+1]
    move $t2, $t5               
    addi $t2, $t2, 1        
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into $s2 spot
    move $t2, $t5
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s2, ($t1)               #store $s2 into $s1 spot
    addi $t5, $t5, 1            #add 1 to itterator
    j next

merge:
#resets itterators for safety/to use again
    li $t4, 0               # = set1 itterator
    li $t5, 0               # = set2 itterator
    li $t7, 0               # = set3 itterator
while:
#while($s1 <= $s4 || $s2 <= $s4) do{
# if($s1 == $s4){ set3[$s3] = set2[$s2]; addi $s2, 1; addi $s3, 1;
#   j while}
# if($s2 == $s4){ set3[$s3] = set1[$s1]; addi $s1, 1; addi $s3, 1;
#   j while}
# if(set1[$s1] > set2[$s2]){ set3[$s3] = set1[$s1]; addi $s1, 1;}
# else{ set3[$s3] = set2[$s2]; addi $s2, 1;}
# addi $s3, 1;
#} return 
# break

    beq $t4, $s4, print         #1st part of while conditional, branch to print if $t4 = $s4
here:
    beq $t4, $s4, if1           #1st if statement, branch to if1 loop if $t4 = $s4
    beq $t5, $s4, if2           #2nd if statement, branch to if2 loop if %t5 = $s4

    la $a0, set1                #3rd if statement
    move $t2, $t4
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load first element from set1 into $s1
    la $a0, set2
    move $t2, $t5
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s2, ($t1)               #load first element from set2 into $s2
    slt $t6, $s2, $s1           #returns 1 if $s1 > $s2
    bnez $t6, if3               #if $t6 =/= 0, branch to if3 loop
    beqz $t6, else3             #if $t6 = 0, branch to else3 loop

if1:
#branch for $s1 == $s4
# set3[$t7] = set2[$t4];
    la $a0, set2                #load set2 address
    move $t2, $t4
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load element at $t4 in set2 to $s1
    la $a0, set3                #load set3
    move $t2, $t7
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into $t7 position in set3
    addi $t4, $t4, 1            #add 1 to $t4 itterator
    addi $t7, $t7, 1            #add 1 to $t7 itterator
    j while


if2:
#branch for $s2 == $s4
# set3[$t7] = set1[$t4];
    la $a0, set1                #load set1 address
    move $t2, $t4               #load itterator into $t2
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load element in position $t4 into $s1
    la $a0, set3                #load set3 address
    move $t2, $t7
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into position $t7 in set3
    addi $t4, $t4, 1            #move to next position in set1
    addi $t7, $t7, 1            #move to next position in set3
    j while

if3:
#branch for set1[$t4] > set2[$s2]
# set3[$t7] = set1[$t4];
    la $a0, set1                #load set1 address
    move $t2, $t4               #move set1 itterator
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s1, ($t1)               #load element at $t4 of set1 into $s1
    la $a0, set3                #load set3 address
    move $t2, $t7               #load set3 itterator
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s1, ($t1)               #store $s1 into set3 at position $t7
    addi $t4, $t4, 1            #move to next position in set1
    addi $t7, $t7, 1            #move to next position in set3
    j while

else3:
#branch for set1[$s1] < set2[$t5]
# set3[$t7] = set2[$t5];
    la $a0, set2                #load set2 address
    move $t2, $t5               #move set2 itterator to $t2
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    lw $s2, ($t1)               #load element in position $t5 of set2 into $s2
    la $a0, set3                #load set3 address
    move $t2, $t7               #move set3 itterator
    sll $t2, $t2, 2
    add $t1, $t2, $a0
    sw $s2, ($t1)               #store element $s2 into position $t7 in set3
    addi $t5, $t5, 1            #move to next position in set2
    addi $t7, $t7, 1            #move to next position in set3
    j while

print:
#itterate through sortedSet and print it to console then exit
    blt $t5, $s4, here          #go to label here if 2nd part of while conditional is not met
    li $v0, 4   
    la $a0, msg3                #load msg3
    syscall                 #print to screen
    la $t3, set3                #load addresss of set3
    move $t2, $s3               #move set3 size into $t2
    li $t7, 0               #load 0 into set3 itterator
print2:
    sll $t7, $t7, 2
    add $t1, $t7, $t3
    li $v0, 1
    lw $a0, ($t3)               #load element at position $t2 of set3 into $a0
    syscall                 #print to screen
    li $v0, 4
    la $a0, coma                #load address of coma
    syscall                 #print screen
    addi $t7, $t7, 1            #move to next element in set3
    addi $t2, $t2, -1           #subtract 1 from set3 size
    bnez $t2, print2            #if set3 size =/= 0, branch to print2

    li $v0, 10
    syscall                 #exit program

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

回眸一遍 2024-11-07 17:46:36

嘿,我的代码也遇到了同样的问题,但我发现了,我的问题与我在打印之前加载数组间距地址有关。我看到您确实再次加载了 set3,但问题可能在于您实际将值存储在寄存器中或加载正确的寄存器

Hey I just had the same problem with my code but I figured it out, mines had to do with me loading the array spacing address before I print. I see you do load the set3 again but maybe the problem is with your actual storing the values in register or loading the correct register

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文