Modify data store location
This commit is contained in:
320
24sort_nums_no_init.asm
Normal file
320
24sort_nums_no_init.asm
Normal file
@@ -0,0 +1,320 @@
|
||||
.text
|
||||
#initialize $sp
|
||||
lui $sp, 0x4000
|
||||
addi $sp, $sp, 0x7ff
|
||||
|
||||
# load digit to mem
|
||||
lui $s0, 0x4000
|
||||
addi $s0, $s0, 0x20
|
||||
#0
|
||||
addi $s1, $zero, 0x3f
|
||||
sw $s1, 0($s0)
|
||||
#1
|
||||
addi $s1, $zero, 0x6
|
||||
sw $s1, 4($s0)
|
||||
#2
|
||||
addi $s1, $zero, 0x5b
|
||||
sw $s1, 8($s0)
|
||||
#3
|
||||
addi $s1, $zero, 0x4f
|
||||
sw $s1, 12($s0)
|
||||
#4
|
||||
addi $s1, $zero, 0x66
|
||||
sw $s1, 16($s0)
|
||||
#5
|
||||
addi $s1, $zero, 0x6d
|
||||
sw $s1, 20($s0)
|
||||
#6
|
||||
addi $s1, $zero, 0x7d
|
||||
sw $s1, 24($s0)
|
||||
#7
|
||||
addi $s1, $zero, 0x7
|
||||
sw $s1, 28($s0)
|
||||
#8
|
||||
addi $s1, $zero, 0x7f
|
||||
sw $s1, 32($s0)
|
||||
#9
|
||||
addi $s1, $zero, 0x6f
|
||||
sw $s1, 36($s0)
|
||||
#A
|
||||
addi $s1, $zero, 0x77
|
||||
sw $s1, 40($s0)
|
||||
#B
|
||||
addi $s1, $zero, 0x7c
|
||||
sw $s1, 44($s0)
|
||||
#C
|
||||
addi $s1, $zero, 0x58
|
||||
sw $s1, 48($s0)
|
||||
#D
|
||||
addi $s1, $zero, 0x5e
|
||||
sw $s1, 52($s0)
|
||||
#E
|
||||
addi $s1, $zero, 0x79
|
||||
sw $s1, 56($s0)
|
||||
#F
|
||||
addi $s1, $zero, 0x71
|
||||
sw $s1, 60($s0)
|
||||
|
||||
main:
|
||||
jal disp_num_in_mem
|
||||
|
||||
lui $t0, 0x4000
|
||||
lw $a0, 0x60($t0)
|
||||
jal insertion_sort
|
||||
end:
|
||||
jal disp_num_in_mem
|
||||
j end
|
||||
|
||||
disp_num_in_mem:
|
||||
addi $sp, $sp, -20
|
||||
sw $ra, 4($sp)
|
||||
sw $s0, 8($sp)
|
||||
sw $s1, 12($sp)
|
||||
sw $s2, 16($sp)
|
||||
sw $s3, 20($sp)
|
||||
|
||||
lui $s0, 0x4000
|
||||
# s1 = 0x40000010
|
||||
addi $s1, $s0, 0x10
|
||||
# s0 = 0x40000060
|
||||
addi $s0, $s0, 0x60
|
||||
addi $s2, $zero, 0
|
||||
# addi $s3, $zero, 20
|
||||
lw $s3, 0($s0) # s3 is the total count
|
||||
addi $s0, $s0, 4
|
||||
display_single_number:
|
||||
sll $t0, $s2, 2
|
||||
add $t0, $s0, $t0
|
||||
lw $a0, 0($t0)
|
||||
addi $a1, $s1, 0
|
||||
jal display_number
|
||||
|
||||
addi $s2, $s2, 1
|
||||
sub $t0, $s3, $s2
|
||||
bgtz $t0, display_single_number
|
||||
|
||||
|
||||
jal display_empty
|
||||
|
||||
lw $ra, 4($sp)
|
||||
lw $s0, 8($sp)
|
||||
lw $s1, 12($sp)
|
||||
lw $s2, 16($sp)
|
||||
lw $s3, 20($sp)
|
||||
addi $sp, $sp, 20
|
||||
jr $ra
|
||||
|
||||
# ------------------------------------------------------
|
||||
|
||||
# a0 is the number to be displayed, a1 is the bcd control addr
|
||||
display_number:
|
||||
addi $sp, $sp, -32
|
||||
sw $ra, 4($sp)
|
||||
sw $s0, 8($sp)
|
||||
sw $s1, 12($sp)
|
||||
sw $s2, 16($sp)
|
||||
sw $s3, 20($sp)
|
||||
sw $s4, 24($sp)
|
||||
sw $s5, 28($sp)
|
||||
sw $s6, 32($sp)
|
||||
|
||||
# s0 is the number to be displayed
|
||||
addi $s0, $a0, 0
|
||||
|
||||
# s1 is the bcd_control addr
|
||||
addi $s1, $a1, 0
|
||||
|
||||
# s2 is the base addr for display digit
|
||||
lui $s2, 0x4000
|
||||
addi $s2, $s2, 0x20
|
||||
|
||||
# s3 is the counter for a complete scan of 4 digit
|
||||
# addi $s3, $zero, 0x17c4
|
||||
addi $s3, $zero, 0xbe2
|
||||
all_digit_scan_loop:
|
||||
# s4 is the num being shifted gradually
|
||||
addi $s4, $s0, 0
|
||||
# s6 is the enable digit
|
||||
addi $s6, $zero, 0x100
|
||||
|
||||
addi $s5, $zero, 4
|
||||
single_digit_loop:
|
||||
# get a digit
|
||||
andi $t0, $s4, 0xf
|
||||
# digit * 4 is the memory shift
|
||||
sll $t0, $t0, 2
|
||||
add $t0, $s2, $t0
|
||||
lw $t0, 0($t0)
|
||||
or $t0, $t0, $s6
|
||||
sw $t0, 0($s1)
|
||||
|
||||
srl $s4, $s4, 4
|
||||
sll $s6, $s6, 1
|
||||
|
||||
addi $t0, $zero, 0x400
|
||||
wait_time_loop:
|
||||
addi $t0, $t0, -1
|
||||
bgtz $t0, wait_time_loop
|
||||
|
||||
addi $s5, $s5, -1
|
||||
bgtz $s5, single_digit_loop
|
||||
# end of single digit loop
|
||||
|
||||
# ** depends on the clock **
|
||||
# four digit, 328.68us.
|
||||
# 1s / 328.68us = 3042 = (be2)hex
|
||||
|
||||
addi $s3, $s3, -1
|
||||
bgtz $s3, all_digit_scan_loop
|
||||
|
||||
lw $ra, 4($sp)
|
||||
lw $s0, 8($sp)
|
||||
lw $s1, 12($sp)
|
||||
lw $s2, 16($sp)
|
||||
lw $s3, 20($sp)
|
||||
lw $s4, 24($sp)
|
||||
lw $s5, 28($sp)
|
||||
lw $s6, 32($sp)
|
||||
addi $sp, $sp, 32
|
||||
jr $ra
|
||||
|
||||
display_empty:
|
||||
lui $t0, 0x4000
|
||||
addi $t0, $t0, 0x10
|
||||
sw $zero, 0($t0)
|
||||
|
||||
lui $t0, 0x100
|
||||
display_empty_wait_loop:
|
||||
addi $t0, $t0, -1
|
||||
bgtz $t0, display_empty_wait_loop
|
||||
jr $ra
|
||||
|
||||
# a0 is the total number of numbers needed to be sorted
|
||||
insertion_sort:
|
||||
addi $sp, $sp, -12
|
||||
sw $ra, 4($sp)
|
||||
sw $s0, 8($sp)
|
||||
sw $s1, 12($sp)
|
||||
|
||||
# la $t0, num_N
|
||||
# lw $s0, 0($t0) # n in s0
|
||||
addi $s0, $a0, 0
|
||||
|
||||
# li $s1, 1 # i in s1
|
||||
addi $s1, $zero, 1
|
||||
item_loop:
|
||||
# bge $s1, $s0, done_item_loop # if i >= n, done loop
|
||||
sub $t0, $s0, $s1
|
||||
blez $t0, done_item_loop
|
||||
|
||||
li $a0, 0
|
||||
addi $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, 4($sp)
|
||||
lw $s0, 8($sp)
|
||||
lw $s1, 12($sp)
|
||||
addi $sp, $sp, 12
|
||||
jr $ra
|
||||
|
||||
binary_search: # a0: left, a1: right, a2: i
|
||||
addi $sp, $sp, -20
|
||||
sw $s0, 4($sp)
|
||||
sw $s1, 8($sp)
|
||||
sw $s2, 12($sp)
|
||||
sw $s3, 16($sp)
|
||||
sw $ra, 20($sp)
|
||||
|
||||
# ble $a0, $a1, in_boundary_binary_search # left <= right, in normal position
|
||||
sub $t0, $a0, $a1
|
||||
blez $t0, in_boundary_binary_search
|
||||
|
||||
# move $v0, $a0 # now in boundary condition
|
||||
add $v0, $a0, $zero
|
||||
|
||||
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
|
||||
lui $t0, 0x4000
|
||||
addi $t0, $t0, 0x64
|
||||
|
||||
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'
|
||||
sub $t0, $t1, $t2
|
||||
blez $t0, binary_search_right
|
||||
binary_search_left:
|
||||
addi $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, 4($sp)
|
||||
lw $s1, 8($sp)
|
||||
lw $s2, 12($sp)
|
||||
lw $s3, 16($sp)
|
||||
lw $ra, 20($sp)
|
||||
addi $sp, $sp, 20
|
||||
jr $ra
|
||||
|
||||
insert: # $a0: int k, $a1: int n
|
||||
addi $sp, $sp, -12
|
||||
sw $s0, 4($sp)
|
||||
sw $s1, 8($sp)
|
||||
sw $ra, 12($sp)
|
||||
|
||||
# la $s0, num_buff # s0 = &v[0]
|
||||
lui $s0, 0x4000
|
||||
addi $s0, $s0, 0x64
|
||||
|
||||
sll $t0, $a1, 2
|
||||
add $s2, $s0, $t0
|
||||
lw $s2, 0($s2) # s2 = tmp = 'pivot' = v[n]
|
||||
|
||||
addi $s1, $a1, -1 # s1 = i = n - 1
|
||||
|
||||
insert_loop:
|
||||
# blt $s1, $a0, done_insert_loop # i < k, done loop
|
||||
sub $t0, $s1, $a0
|
||||
bltz $t0, done_insert_loop
|
||||
|
||||
sll $t0, $s1, 2
|
||||
add $t0, $s0, $t0 # t0 = &v[i]
|
||||
lw $t1, 0($t0)
|
||||
sw $t1, 4($t0)
|
||||
|
||||
addi $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, 4($sp)
|
||||
lw $s1, 8($sp)
|
||||
lw $ra, 12($sp)
|
||||
addi $sp, $sp, 12
|
||||
jr $ra
|
||||
Reference in New Issue
Block a user