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