使用数组合并排序(在MIPS汇编程序中)

时间:2011-04-10 19:23:33

标签: arrays sorting assembly merge mips

该程序的目的是获取偶数个用户输入的整数并对它们进行排序(使用合并排序)。它将排序列表打印到屏幕上。程序首先获取设置大小,然后询问整数。它将它们分成两个甚至是单独的集合,然后从这里按升序对它们进行排序。当两个集合都已排序时,程序将在最终排序集合中将两个集合合并在一起。然后将最终设置打印到屏幕上。 我得到的输出只是一个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

1 个答案:

答案 0 :(得分:0)

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