2.2
This commit is contained in:
205
1/homework/exp2/binary_insert_sort.asm
Normal file
205
1/homework/exp2/binary_insert_sort.asm
Normal 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
|
||||
Reference in New Issue
Block a user