This commit is contained in:
unlockable
2024-05-03 19:53:25 +08:00
parent 30ad2353e0
commit 64771f7a0c

View File

@@ -0,0 +1,205 @@
.data
compare_count: .word 0
num_N: .word 0
input_file_name: .asciiz "a.in"
.align 2
output_file_name: .asciiz "a.out"
.align 2
space_string: .asciiz " "
.align 2
newline_string: .asciiz "\r\n"
.align 2
num_buff: .space 4096
.align 2
.text
main:
la $a0, input_file_name
li $a1, 0
li $a2, 0
li $v0, 13
syscall
move $a0, $v0 # start to read in N
la $a1, num_N
li $a2, 4
li $v0, 14
syscall
la $t0, num_N # read N * 4 bytes into num_buff
lw $a2, 0($t0) # read in num_N
sll $a2, $a2, 2 # n * 4 is the bytes to read
la $a1, num_buff
li $v0, 14
syscall # read in file
li $v0, 16
syscall # close file
# jal print_num_in_buff
jal insertion_sort
# jal print_num_in_buff
la $a0, output_file_name
li $a1, 1
li $a2, 0
li $v0, 13
syscall
move $a0, $v0
la $a1, compare_count
li $a2, 4
li $v0, 15
syscall
la $a1, num_buff
la $a2, num_N
lw $a2, 0($a2)
sll $a2, $a2, 2
li $v0, 15
syscall
li $v0, 17
syscall # exit
insertion_sort:
subi $sp, $sp, 4
sw $ra, 0($sp)
la $t0, num_N
lw $s0, 0($t0) # n in s0
li $s1, 1 # i in s1
item_loop:
bge $s1, $s0, done_item_loop # if i >= n, done loop
li $a0, 0
subi $a1, $s1, 1
move $a2, $s1
jal binary_search
move $a0, $v0
move $a1, $s1
jal insert
addi $s1, $s1, 1 # i ++
j item_loop
done_item_loop:
lw $ra, 0($sp)
addi $sp, $sp, 8
jr $ra
binary_search: # a0: left, a1: right, a2: i
subi $sp, $sp, 20
sw $s0, 16($sp)
sw $s1, 12($sp)
sw $s2, 8($sp)
sw $s3, 4($sp)
sw $ra, 0($sp)
ble $a0, $a1, in_boundary_binary_search # left <= right, in normal position
move $v0, $a0 # now in boundary condition
j done_binary_search
in_boundary_binary_search:
move $s0, $a0 # in normal situation
move $s1, $a1
move $s2, $a2
add $s3, $s0, $s1 # s3 = mid = (left + right) >> 1
srl $s3, $s3, 1
jal add_compare_count
la $t0, num_buff
sll $t1, $s3, 2
add $t1, $t1, $t0
lw $t1, 0($t1) # t1 = v[mid]
sll $t2, $s2, 2
add $t2, $t2, $t0
lw $t2, 0($t2) # t2 = v[n]
ble $t1, $t2, binary_search_right # v[mid] <= v[n], jump to 'else'
binary_search_left:
subi $a1, $s3, 1
jal binary_search
j done_binary_search
binary_search_right:
addi $a0, $s3, 1
jal binary_search
done_binary_search:
lw $s0, 16($sp)
lw $s1, 12($sp)
lw $s2, 8($sp)
lw $s3, 4($sp)
lw $ra, 0($sp)
addi $sp, $sp, 20
jr $ra
insert: # $a0: int k, $a1: int n
subi $sp, $sp, 12
sw $s0, 8($sp)
sw $s1, 4($sp)
sw $ra, 0($sp)
la $s0, num_buff # s0 = &v[0]
sll $t0, $a1, 2
add $s2, $s0, $t0
lw $s2, 0($s2) # s2 = tmp = 'pivot' = v[n]
subi $s1, $a1, 1 # s1 = i = n - 1
insert_loop:
blt $s1, $a0, done_insert_loop # i < k, done loop
sll $t0, $s1, 2
add $t0, $s0, $t0 # t0 = &v[i]
lw $t1, 0($t0)
sw $t1, 4($t0)
subi $s1, $s1, 1 # i--
j insert_loop
done_insert_loop:
sll $t0, $a0, 2
add $t0, $s0, $t0
sw $s2, 0($t0) # t0 = &v[k]
lw $s0, 8($sp)
lw $s1, 4($sp)
lw $ra, 0($sp)
addi $sp, $sp, 12
jr $ra
add_compare_count:
la $t0, compare_count
lw $t1, 0($t0)
addi $t1, $t1, 1
sw $t1, 0($t0)
jr $ra
print_num_in_buff:
la $t0, num_N
la $t2, num_buff
lw $t0, 0($t0)
li $t1, 0
print_loop:
bge $t1, $t0, done_print_loop
sll $a0, $t1, 2
add $a0, $t2, $a0
lw $a0, 0($a0)
li $v0, 1
syscall
la $a0, space_string
li $v0, 4
syscall
addi $t1, $t1, 1
j print_loop
done_print_loop:
la $a0, newline_string
li $v0, 4
syscall
jr $ra