与数组的合并排序(在 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
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
嘿,我的代码也遇到了同样的问题,但我发现了,我的问题与我在打印之前加载数组间距地址有关。我看到您确实再次加载了 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