我正在尝试在MIPS中编写选择排序算法但是遇到了问题。我已经单独测试了我的swap和findSmallest函数,它们似乎正在工作但是当我运行代码时,我在输出中得到了一些地址(我假设)。
.data
.align 2
values: .word 12, 15, 13, 2, 25, 3, 5
valueCount: .word 7
initialPrint: .asciiz "\Unsorted Array: \n"
donePrint: .asciiz "\n Sorted Array: \n"
comma: .asciiz ", "
.text
.globl main
main: # Beginning stuff
la $a0, initialPrint # load initialPrint string into a0
li $v0, 4 # set code (4) to print string
syscall # print initialPrint
la $s6, values
la $s7, valueCount
lw $s7, 0($s7) # extract valueCount word from s7
move $a0, $s6 # move values into $a0 for function call
move $a1, $s7 # move valueCount into $a1 for function call
jal printList # print initial array
li $s1, 0 # index = 1
selectionSort: # Middle stuff
bge $s1, $s7, endPrint
move $a0, $s6 # move values into $a0 for function call
move $a1, $s7 # move valueCount into $a1 for function call
move $a2, $s1 # move index into $a2 for function call
jal findSmallest # Let's get this show on the road
move $a0, $v0 # move smallestIndex into a0
move $a1, $s1 # move currentndex into $a1
move $a2, $s6 # move values into $a2
jal swap # swap
move $s6, $v0 # move swapped array into $s6
addi $s6, $s6, 4 # next position in array
addi $s1, $s1, 1 # index++
j selectionSort
# Ending stuff
endPrint: la $a0, donePrint # load donePrint string into a0
li $v0, 4 # set code (4) to print string
syscall # print donePrint
move $a0, $s6 # move values into $a0 for function call
move $a1, $s7 # move valueCount into $a1 for function call
jal printList # print initial array
li $v0, 10 # load end call
syscall # end
##########################################################################################
############# findSmallest Function ##################################################
##########################################################################################
## takes in array, current index, and valueCount
## examines all elements from n-index through n
## outputs index of lowest value
findSmallest: ## Begin Function
addi $sp, $sp, -24 # preserve state before function call
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
sw $s4, 20($sp)
sw $t1, 24($sp)
## s0 = values
## s1 = valueCount
## s2 = index
## s3 = smallestIndex
## s4 = smallestValue
## t1 = currentValue
## Function Body
move $s0, $a0 # move values into s0
move $s1, $a1 # move valueCount into s1
move $s2, $a2 # move index into s2
lw $s4, 0($s0) # load first word
addi $s0, $s0, 4 # move to next word
addi $s2, $s2, 1
floop: bge $s2, $s1, endLoop # if index >= valueCount then done
lw $t1, 0($s0) # load currentValue
ble $s4, $t1, skip # if smallestValue < currentValue then skip
move $s4, $t1 # set smallestValue = currentValue
move $s3, $s2 # set smallestIndex = currentIndex
skip:
addi $s0, $s0, 4 # iterate to next word in values
addi $s2, $s2, 1 # index++
j floop # repeat loop
endLoop: move $v0, $s3
# End Function Stuff
lw $ra, 0($sp) # restore state before function call
lw $s0, 4($sp)
lw $s1, 8($sp)
lw $s2, 12($sp)
lw $s3, 16($sp)
lw $s4, 20($sp)
lw $t1, 24($sp)
addi $sp, $sp, 24
jr $ra
##########################################################################################
############# swap Function ##########################################################
##########################################################################################
swap: # Begin Function
addi $sp, $sp, -32 # preserve state before function call
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $t1, 12($sp)
sw $t2, 16($sp)
sw $t3, 20($sp)
sw $t4, 24($sp)
sw $s6, 28($sp)
# main function
move $s0, $a0 # move smallestIndex into function
move $s1, $a1 # move targetIndex into function
move $s6, $a2
sll $s0, $s0, 2
add $t1, $s0, $s6
lw $t2, 0($t1) # get the value from the array cell
sll $s1, $s1, 2
add $t3, $s1, $s6
lw $t4, 0($t3) # get the value from the array cell
sw $t2, 0($t3)
sw $t4, 0($t1)
move $v0, $s6
# End Function # restore state before function call
lw $ra, 0($sp)
lw $s0, 4($sp)
lw $s1, 8($sp)
lw $t1, 12($sp)
lw $t2, 16($sp)
lw $t3, 20($sp)
lw $t4, 24($sp)
lw $s6, 28($sp)
addi $sp, $sp, 32
jr $ra
##########################################################################################
############# printList Function #####################################################
##########################################################################################
# a0 - values array (address)
# a1 - valueCount (word)
# s6 - values
# s7 - valueCount (word)
printList:
## Setup
## Begin Function
addi $sp, $sp, -16 # allocate stack space for 3 values
sw $ra, 0($sp) # store return adder
sw $s6, 4($sp)
sw $s7, 8($sp)
sw $s0, 12($sp)
move $s6, $a0
move $s7, $a1
li $s0, 1 # index = 1
print:
lw $a0, 0($s6)
li $v0, 1 # load output call
syscall # output value
la $a0, comma # load comma string into a0
li $v0, 4 # set code (4) to print string
syscall # print initialPrint
addi $s6, $s6, 4
addi $s0, $s0, 1
ble $s0, $s7, print
# End Function Stuff
lw $ra, 0($sp) # store return adder
lw $s6, 4($sp)
lw $s7, 8($sp)
lw $s0, 12($sp)
addi $sp, $sp, 16
jr $ra
我的输出:
Unsorted Array:
12, 15, 13, 2, 25, 3, 5, soSorted Array:
25, 1684370546, 13, 3, 540703073, 1869835861, 1953656659,
它必须与数组的存储方式有关,因为输出中有内存地址。
答案 0 :(得分:0)
我在您的代码中发现了许多问题:
move $a0, $v0 # move smallestIndex into a0
move $a1, $s1 # move currentndex into $a1
move $a2, $s6 # move values into $a2
jal swap # swap
这里你传递了几个相对于数组开头的索引,但是$s6
在每次迭代结束时递增,所以它只会指向第一次迭代期间数组的开头。您应该使用move $a2, $s6
而不是la $a2, values
。
move $s6, $v0 # move swapped array into $s6
这应该完全删除。
move $a0, $s6 # move values into $a0 for function call
move $a1, $s7 # move valueCount into $a1 for function call
jal printList
在这里,您应该将数组的基址放在$a0
中,因此它应该是la $a0, values
而不是move $a0, $s6
。
在findSmallest
中,对于第一个元素是最小元素的情况,您似乎没有初始化$s3
。