Init commit: Combine all COD projects to one repo
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
.data
|
||||
v: .word 3, 10, 8, 2, 7, 1, 5, 9, 6, 4
|
||||
|
||||
.text
|
||||
.globl main
|
||||
main:
|
||||
# intro - stack-frame
|
||||
addi $sp, $sp, -12 # main
|
||||
sw $ra, 8($sp)
|
||||
sw $fp, 4($sp)
|
||||
sw $s0, 0($sp)
|
||||
addi $fp, $sp, 8
|
||||
|
||||
li $t0, 10
|
||||
|
||||
li $a0, 0
|
||||
li $a1, 9
|
||||
la $s0, v
|
||||
jal qsort
|
||||
|
||||
# epilogue - stack-frame
|
||||
lw $s0, 0($sp)
|
||||
lw $fp, 4($sp)
|
||||
lw $ra, 8($sp)
|
||||
addi $sp, $sp, 12
|
||||
jr $ra
|
||||
|
||||
|
||||
# swap(int i, int j) : swaps elements of v[]
|
||||
# at positions i and j
|
||||
# $a0 = i
|
||||
# $a1 = j
|
||||
# $s0 = v
|
||||
.text
|
||||
swap:
|
||||
# intro - stack-frame
|
||||
addi $sp, $sp, -28
|
||||
sw $ra, 24($sp)
|
||||
sw $fp, 20($sp)
|
||||
|
||||
sw $s0, 16($sp) # v
|
||||
sw $t0, 12($sp) # temp
|
||||
sw $t1, 8($sp) # *v[i]
|
||||
sw $t2, 4($sp) # *v[j]
|
||||
sw $t3, 0($sp) # buffer
|
||||
addi $fp, $sp, 24
|
||||
|
||||
|
||||
move $t1, $s0 # pointer assignements
|
||||
sll $a0, $a0, 2
|
||||
add $t1, $t1, $a0
|
||||
move $t2, $s0
|
||||
sll $a1, $a1, 2
|
||||
add $t2, $t2, $a1
|
||||
|
||||
lw $t0, 0($t1) # temp = v[i]
|
||||
lw $t3, 0($t2) # v[i] = v[j]
|
||||
sw $t3, 0($t1)
|
||||
sw $t0, 0($t2) # v[j] = temp
|
||||
|
||||
# epilogue - stack-frame
|
||||
lw $t3, 0($sp)
|
||||
lw $t2, 4($sp)
|
||||
lw $t1, 8($sp)
|
||||
lw $t0, 12($sp)
|
||||
lw $s0, 16($sp)
|
||||
|
||||
lw $fp, 20($sp)
|
||||
lw $ra, 24($sp)
|
||||
addi $sp, $sp, 28
|
||||
jr $ra
|
||||
|
||||
# partition(int f, int l) : partitions elements in vector v[]
|
||||
# between positions f and l, using as pivot the element v[l], such
|
||||
# that
|
||||
# i < p ==> v[i] <= v[p]
|
||||
# i > p ==> v[p] < v[i]
|
||||
# The function returns the position p of the pivot.
|
||||
# $a0 = f
|
||||
# $a1 = l
|
||||
# $s0 = v
|
||||
# $v0 = p
|
||||
.text
|
||||
partition:
|
||||
# intro - stack-frame
|
||||
addi $sp, $sp, -40
|
||||
sw $ra, 36($sp)
|
||||
sw $fp, 32($sp)
|
||||
|
||||
sw $s0, 28($sp) # v
|
||||
sw $s1, 24($sp) # pivot
|
||||
sw $s2, 20($sp) # i
|
||||
sw $s3, 16($sp) # j
|
||||
sw $s4, 12($sp) # a0 (f)
|
||||
sw $s5, 8($sp) # a1 (l)
|
||||
sw $t0, 4($sp)
|
||||
sw $t1, 0($sp)
|
||||
addi $fp, $sp, 36
|
||||
|
||||
move $s4, $a0
|
||||
move $s5, $a1
|
||||
move $t0, $s0 # make *v[l]
|
||||
move $t1, $a1 # t1 = l
|
||||
sll $t1, $t1, 2 # t1 *= 4
|
||||
add $t0, $t0, $t1
|
||||
lw $s1, 0($t0) # pivot = v[l]
|
||||
|
||||
move $s2, $s4 # i = f;
|
||||
|
||||
# for () {
|
||||
move $s3, $s4 # j = f;
|
||||
_part_loop0:
|
||||
slt $t0, $s3, $s5 # j < l
|
||||
beq $t0, $0, _part_loop_end
|
||||
move $t0, $s0 # make *v[j]
|
||||
move $t1, $s3
|
||||
sll $t1, $t1, 2
|
||||
add $t0, $t0, $t1
|
||||
lw $t1, 0($t0) # t1 = v[j]
|
||||
# if (v[j] < pivot)
|
||||
slt $t0, $t1, $s1
|
||||
beq $t0, $0, _part_loop_else
|
||||
|
||||
move $a0, $s2 # swap (i, j);
|
||||
move $a1, $s3
|
||||
jal swap
|
||||
addi $s2, $s2, 1 # i++
|
||||
|
||||
_part_loop_else:
|
||||
addi $s3, $s3, 1 # j++
|
||||
j _part_loop0 # }
|
||||
_part_loop_end:
|
||||
move $a0, $s2 # swap (i, l)
|
||||
move $a1, $s5
|
||||
jal swap
|
||||
|
||||
move $v0, $s2 #return i
|
||||
|
||||
# epilogue - stack-frame
|
||||
lw $t1, 0($sp)
|
||||
lw $t0, 4($sp)
|
||||
lw $s5, 8($sp)
|
||||
lw $s4, 12($sp)
|
||||
lw $s3, 16($sp)
|
||||
lw $s2, 20($sp)
|
||||
lw $s1, 24($sp)
|
||||
lw $s0, 28($sp)
|
||||
|
||||
lw $fp, 32($sp)
|
||||
lw $ra, 36($sp)
|
||||
addi $sp, $sp, 40
|
||||
jr $ra
|
||||
|
||||
|
||||
# qsort(int f, int l) : sorts the elements of v[]
|
||||
# between positions f:l
|
||||
# $a0 = f
|
||||
# $a1 = l
|
||||
# $s0 = v
|
||||
.text
|
||||
qsort: # qsort entry point
|
||||
# intro - stack-frame with 4byte local var @ fp
|
||||
addi $sp, $sp, -28 # qsort
|
||||
sw $ra, 24($sp)
|
||||
sw $fp, 20($sp)
|
||||
|
||||
sw $s0, 16($sp) # v
|
||||
sw $s2, 12($sp) # a0 (f)
|
||||
sw $s3, 8($sp) # a1 (l)
|
||||
sw $t0, 4($sp)
|
||||
addi $fp, $sp, 24
|
||||
|
||||
move $s2, $a0 # get f, l
|
||||
move $s3, $a1
|
||||
# if (f < l) {
|
||||
slt $t0, $s2, $s3
|
||||
beq $t0, $0, _qsort_end
|
||||
|
||||
move $a0, $s2 # pivot = partition(f, l);
|
||||
move $a1, $s3
|
||||
jal partition
|
||||
sw $v0, 0($sp)
|
||||
|
||||
move $a0, $s2 # qsort(f, pivot - 1);
|
||||
lw $t0, 0($sp)
|
||||
addi $t0, $t0, -1
|
||||
move $a1, $t0
|
||||
jal qsort
|
||||
|
||||
lw $t0, 0($sp) # qsort(pivot + 1, l);
|
||||
addi $t0, $t0, 1
|
||||
move $a0, $t0
|
||||
move $a1, $s3
|
||||
jal qsort
|
||||
# }
|
||||
_qsort_end:
|
||||
# epilogue - stack-frame
|
||||
lw $t0, 4($sp)
|
||||
lw $s3, 8($sp)
|
||||
lw $s2, 12($sp)
|
||||
lw $s0, 16($sp)
|
||||
|
||||
lw $fp, 20($sp)
|
||||
lw $ra, 24($sp)
|
||||
addi $sp, $sp, 28
|
||||
jr $ra # return to caller
|
||||
|
||||
@@ -0,0 +1,207 @@
|
||||
.data
|
||||
v: .word 3, 10, 8, 2, 7, 1, 5, 9, 6, 4
|
||||
|
||||
|
||||
# swap(int i, int j) : swaps elements of v[]
|
||||
# at positions i and j
|
||||
# $a0 = i
|
||||
# $a1 = j
|
||||
# $s0 = v
|
||||
.text
|
||||
swap:
|
||||
# intro - stack-frame
|
||||
addi $sp, $sp, -28
|
||||
sw $ra, 24($sp)
|
||||
sw $fp, 20($sp)
|
||||
|
||||
sw $s0, 16($sp) # v
|
||||
sw $t0, 12($sp) # temp
|
||||
sw $t1, 8($sp) # *v[i]
|
||||
sw $t2, 4($sp) # *v[j]
|
||||
sw $t3, 0($sp) # buffer
|
||||
addi $fp, $sp, 24
|
||||
|
||||
|
||||
move $t1, $s0 # pointer assignements
|
||||
sll $a0, $a0, 2
|
||||
add $t1, $t1, $a0
|
||||
move $t2, $s0
|
||||
sll $a1, $a1, 2
|
||||
add $t2, $t2, $a1
|
||||
|
||||
lw $t0, 0($t1) # temp = v[i]
|
||||
lw $t3, 0($t2) # v[i] = v[j]
|
||||
sw $t3, 0($t1)
|
||||
sw $t0, 0($t2) # v[j] = temp
|
||||
|
||||
# epilogue - stack-frame
|
||||
lw $t3, 0($sp)
|
||||
lw $t2, 4($sp)
|
||||
lw $t1, 8($sp)
|
||||
lw $t0, 12($sp)
|
||||
lw $s0, 16($sp)
|
||||
|
||||
lw $fp, 20($sp)
|
||||
lw $ra, 24($sp)
|
||||
addi $sp, $sp, 28
|
||||
jr $ra
|
||||
|
||||
# partition(int f, int l) : partitions elements in vector v[]
|
||||
# between positions f and l, using as pivot the element v[l], such
|
||||
# that
|
||||
# i < p ==> v[i] <= v[p]
|
||||
# i > p ==> v[p] < v[i]
|
||||
# The function returns the position p of the pivot.
|
||||
# $a0 = f
|
||||
# $a1 = l
|
||||
# $s0 = v
|
||||
# $v0 = p
|
||||
.text
|
||||
partition:
|
||||
# intro - stack-frame
|
||||
addi $sp, $sp, -40
|
||||
sw $ra, 36($sp)
|
||||
sw $fp, 32($sp)
|
||||
|
||||
sw $s0, 28($sp) # v
|
||||
sw $s1, 24($sp) # pivot
|
||||
sw $s2, 20($sp) # i
|
||||
sw $s3, 16($sp) # j
|
||||
sw $s4, 12($sp) # a0 (f)
|
||||
sw $s5, 8($sp) # a1 (l)
|
||||
sw $t0, 4($sp)
|
||||
sw $t1, 0($sp)
|
||||
addi $fp, $sp, 36
|
||||
|
||||
move $s4, $a0
|
||||
move $s5, $a1
|
||||
move $t0, $s0 # make *v[l]
|
||||
move $t1, $a1 # t1 = l
|
||||
sll $t1, $t1, 2 # t1 *= 4
|
||||
add $t0, $t0, $t1
|
||||
lw $s1, 0($t0) # pivot = v[l]
|
||||
|
||||
move $s2, $s4 # i = f;
|
||||
|
||||
# for () {
|
||||
move $s3, $s4 # j = f;
|
||||
_part_loop0:
|
||||
slt $t0, $s3, $s5 # j < l
|
||||
beq $t0, $0, _part_loop_end
|
||||
move $t0, $s0 # make *v[j]
|
||||
move $t1, $s3
|
||||
sll $t1, $t1, 2
|
||||
add $t0, $t0, $t1
|
||||
lw $t1, 0($t0) # t1 = v[j]
|
||||
# if (v[j] < pivot)
|
||||
slt $t0, $t1, $s1
|
||||
beq $t0, $0, _part_loop_else
|
||||
|
||||
move $a0, $s2 # swap (i, j);
|
||||
move $a1, $s3
|
||||
jal swap
|
||||
addi $s2, 1 # i++
|
||||
|
||||
_part_loop_else:
|
||||
addi $s3, 1 # j++
|
||||
j _part_loop0 # }
|
||||
_part_loop_end:
|
||||
move $a0, $s2 # swap (i, l)
|
||||
move $a1, $s5
|
||||
jal swap
|
||||
|
||||
move $v0, $s2 #return i
|
||||
|
||||
# epilogue - stack-frame
|
||||
lw $t1, 0($sp)
|
||||
lw $t0, 4($sp)
|
||||
lw $s5, 8($sp)
|
||||
lw $s4, 12($sp)
|
||||
lw $s3, 16($sp)
|
||||
lw $s2, 20($sp)
|
||||
lw $s1, 24($sp)
|
||||
lw $s0, 28($sp)
|
||||
|
||||
lw $fp, 32($sp)
|
||||
lw $ra, 36($sp)
|
||||
addi $sp, $sp, 40
|
||||
jr $ra
|
||||
|
||||
|
||||
# qsort(int f, int l) : sorts the elements of v[]
|
||||
# between positions f:l
|
||||
# $a0 = f
|
||||
# $a1 = l
|
||||
# $s0 = v
|
||||
.text
|
||||
qsort: # qsort entry point
|
||||
# intro - stack-frame with 4byte local var @ fp
|
||||
addi $sp, $sp, -28 # qsort
|
||||
sw $ra, 24($sp)
|
||||
sw $fp, 20($sp)
|
||||
|
||||
sw $s0, 16($sp) # v
|
||||
sw $s2, 12($sp) # a0 (f)
|
||||
sw $s3, 8($sp) # a1 (l)
|
||||
sw $t0, 4($sp)
|
||||
addi $fp, $sp, 24
|
||||
|
||||
move $s2, $a0 # get f, l
|
||||
move $s3, $a1
|
||||
# if (f < l) {
|
||||
slt $t0, $s2, $s3
|
||||
beq $t0, $0, _qsort_end
|
||||
|
||||
move $a0, $s2 # pivot = partition(f, l);
|
||||
move $a1, $s3
|
||||
jal partition
|
||||
sw $v0, 0($sp)
|
||||
|
||||
move $a0, $s2 # qsort(f, pivot - 1);
|
||||
lw $t0, 0($sp)
|
||||
addi $t0, $t0, -1
|
||||
move $a1, $t0
|
||||
jal qsort
|
||||
|
||||
lw $t0, 0($sp) # qsort(pivot + 1, l);
|
||||
addi $t0, $t0, 1
|
||||
move $a0, $t0
|
||||
move $a1, $s3
|
||||
jal qsort
|
||||
# }
|
||||
_qsort_end:
|
||||
# epilogue - stack-frame
|
||||
lw $t0, 4($sp)
|
||||
lw $s3, 8($sp)
|
||||
lw $s2, 12($sp)
|
||||
lw $s0, 16($sp)
|
||||
|
||||
lw $fp, 20($sp)
|
||||
lw $ra, 24($sp)
|
||||
addi $sp, $sp, 28
|
||||
jr $ra # return to caller
|
||||
|
||||
|
||||
.text
|
||||
.globl main
|
||||
main:
|
||||
# intro - stack-frame
|
||||
addi $sp, $sp, -12 # main
|
||||
sw $ra, 8($sp)
|
||||
sw $fp, 4($sp)
|
||||
sw $s0, 0($sp)
|
||||
addi $fp, $sp, 8
|
||||
|
||||
li $t0, 10
|
||||
|
||||
li $a0, 0
|
||||
li $a1, 9
|
||||
la $s0, v
|
||||
jal qsort
|
||||
|
||||
# epilogue - stack-frame
|
||||
lw $s0, 0($sp)
|
||||
lw $fp, 4($sp)
|
||||
lw $ra, 8($sp)
|
||||
addi $sp, $sp, 12
|
||||
jr $ra
|
||||
@@ -0,0 +1,58 @@
|
||||
//============================================================================
|
||||
// Name : quiz3.cpp
|
||||
// Author : Christos Choutouridis
|
||||
// Version :
|
||||
// Copyright : Your copyright notice
|
||||
// Description : Hello World in C++, Ansi-style
|
||||
//============================================================================
|
||||
|
||||
|
||||
|
||||
int v[] = {
|
||||
3, 10, 8, 2, 7, 1, 5, 9, 6, 4
|
||||
};
|
||||
|
||||
|
||||
void swap (int i, int j) {
|
||||
int t = v[i];
|
||||
v[i] = v[j];
|
||||
v[j] = t;
|
||||
}
|
||||
|
||||
// partition(int f, int l) : permutes the values in vector v[]
|
||||
// between positions f and l, using as pivot the element v[l], such
|
||||
// that
|
||||
// f <= i < p ==> v[i] <= v[p]
|
||||
// p < i <= l ==> v[p] < v[i]
|
||||
// The function returns the position p of the pivot.
|
||||
int partition(int f, int l) {
|
||||
int pivot = v[l]; // element v[l] is the pivot
|
||||
int i = f; // i points to the beginning of the vector
|
||||
|
||||
// loop over vector
|
||||
for (int j = f; j < l; j++)
|
||||
if (v[j] < pivot) // element smaller than pivot
|
||||
swap(i++,j); // swap it with position pointed by i
|
||||
|
||||
swap(i, l ); // swap pivot to its correct position
|
||||
return (i); // return pivot's position
|
||||
}
|
||||
|
||||
// qsort(int f, int l) : sorts the elements of v[] between positions f:l
|
||||
void qsort(int f, int l) {
|
||||
int pivot;
|
||||
if (f < l) {
|
||||
pivot = partition(f, l);
|
||||
|
||||
qsort(f, pivot - 1); // Before pi
|
||||
qsort(pivot + 1, l); // After pi
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
int n = 10;
|
||||
|
||||
qsort (0, 9);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user