2011-04-10 47 views
0

該程序的目的是獲取偶數個用戶輸入的整數並對它們進行排序(使用合併排序)。它將排序後的列表打印到屏幕上。程序首先獲取設定的大小,然後詢問整數。它將它們分成兩組,然後從這裏按升序排序。當兩個集合都被排序時,程序會將兩個集合合併到一個最終的排序集合中。最終的設置然後被打印到屏幕上。 我得到的輸出只是一個0的列表。不知道我的錯誤在哪裏,可以使用一些新鮮的眼睛。謝謝。與數組合並排序(在MIPS彙編器中)

.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 

回答

0

嘿,我只是有與我的代碼相同的問題,但我想通了,地雷必須在我打印之前加載陣列間距地址。我看到你再次加載set3,但也許問題是你的實際存儲值在寄存器或加載正確的寄存器