This commit is contained in:
unlockable
2024-05-03 18:14:00 +08:00
parent 3dac8a6d94
commit 6e37c53946
2 changed files with 188 additions and 0 deletions

BIN
1/homework/exp2/a.in Normal file

Binary file not shown.

View File

@@ -0,0 +1,188 @@
.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 insertion_sort
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
move $a0, $s1
jal 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
search: # $a0: int n
subi $sp, $sp, 12
sw $s0, 8($sp)
sw $s1, 4($sp)
sw $ra, 0($sp)
la $s0, num_buff
sll $t0, $a0, 2
add $s2, $s0, $t0
lw $s2, 0($s2) # s2 = tmp = v[n]
subi $s1, $a0, 1 # i = n - 1
search_loop:
bltz $s1, done_search_loop # i < 0, done loop
jal add_compare_count
sll $t0, $s1, 2
add $t0, $s0, $t0
lw $t0, 0($t0) # t0 = v[i]
ble $t0, $s2, done_search_loop # if v[i] <= tmp, break
subi $s1, $s1, 1 # i--
j search_loop
done_search_loop:
addi $v0, $s1, 1 # return i + 1
lw $s0, 8($sp)
lw $s1, 4($sp)
lw $ra, 0($sp)
addi $sp, $sp, 12
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