2.1
This commit is contained in:
BIN
1/homework/exp2/a.in
Normal file
BIN
1/homework/exp2/a.in
Normal file
Binary file not shown.
188
1/homework/exp2/insert_sort.asm
Normal file
188
1/homework/exp2/insert_sort.asm
Normal 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
|
||||||
Reference in New Issue
Block a user