diff --git a/1/homework/exp2/a.in b/1/homework/exp2/a.in new file mode 100644 index 0000000..2fdfd43 Binary files /dev/null and b/1/homework/exp2/a.in differ diff --git a/1/homework/exp2/insert_sort.asm b/1/homework/exp2/insert_sort.asm new file mode 100644 index 0000000..f879fdb --- /dev/null +++ b/1/homework/exp2/insert_sort.asm @@ -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