52 lines
1.8 KiB
NASM

# data
.data
v : .word 4 3 1 6 2 5 # v is the beginning of a array, whose storage type is a word(four bytes)
# code
.text
.globl main
# main parameter:
# $s0 -> v
# $s1 -> n
# $s2 -> i
# $s3 -> j
main:
la $s0, v # assign base address of v to $a0 (first parameter)
addiu $s1, $zero, 6 # assign 6 to the second parameter, which means the number of the array v
addi $s2, $zero, 0 # int i = 0, save i to $s2 and j to $s3
loop1: # first layer of loop
slt $t0, $s2, $s1 # t0 == 1 if $s2(i) < $s1(n) else t0 == 0
beq $t0, $zero, skip1 # if t0 == 0, which means i >= n, we skip out loop1
addi $s3, $zero, 0 # int j = 0
loop2: # second layer of loop
sub $t0, $s1, $s2
addi $t1, $zero, 1
sub $t0, $t0, $t1 # save n - i - 1 to $t0
slt $t1, $s3, $t0 # t1 == 1 if $s3(j) < $t0(n - i - 1) else t1 == 0
beq $t1, $zero, skip2 # if t1 == 0, which means j >= n - i - 1, we skip out loop2
sll $t2, $s3, 2 # base address shamt of v[j]
add $t2, $s0, $t2 # base address of v[j]
lw $t0, 0($t2) # v[j]
lw $t1, 4($t2) # v[j + 1]
slt $t3, $t1, $t0 # t3 == 1 if $t1(v[j + 1]) < $t0(v[j]) else t3 == 0
beq $t3, $zero, continue # if t3 == 0, we don't need to do the swap, continue
add $t4, $t0, $zero # temp = a[j]
add $t0, $t1, $zero # a[j] = a[j + 1]
add $t1, $t4, $zero # a[j + 1] = temp
sw $t0, 0($t2)
sw $t1, 4($t2)
continue:
addi $s3, $s3, 1 # j ++
j loop2
skip2: # skip out loop2
addi $s2, $s2, 1 # i ++
j loop1
skip1: # skip out loop1