From 64771f7a0c6830166ad9c84d4fa21a141073e585 Mon Sep 17 00:00:00 2001 From: unlockable Date: Fri, 3 May 2024 19:53:25 +0800 Subject: [PATCH] 2.2 --- 1/homework/exp2/binary_insert_sort.asm | 205 +++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 1/homework/exp2/binary_insert_sort.asm diff --git a/1/homework/exp2/binary_insert_sort.asm b/1/homework/exp2/binary_insert_sort.asm new file mode 100644 index 0000000..6f6949f --- /dev/null +++ b/1/homework/exp2/binary_insert_sort.asm @@ -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