summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-04-27 02:40:43 -0400
committerbd <bdunahu@operationnull.com>2025-04-27 02:40:43 -0400
commit34245fcd5c95c0bd45bc762bb9aa4131fe4d503f (patch)
treedde9def82712bfea5c8e8e5c46b80cdee27d2383
parent4de4b5322abaf9da5480242a85352414d92100ff (diff)
Add exchange sort test program
-rw-r--r--input/exchange-sort.asm78
1 files changed, 78 insertions, 0 deletions
diff --git a/input/exchange-sort.asm b/input/exchange-sort.asm
new file mode 100644
index 0000000..363f399
--- /dev/null
+++ b/input/exchange-sort.asm
@@ -0,0 +1,78 @@
+;;;;;;;;
+;;; implements an in-place exchange sort on arr.
+
+.data
+ arr -1318622599 378334259 1389637561 -1972785942 -445476377 -518496482 246156516 534976786 -559365316 208367589 745785340 -90469921 184774746 -1410662069 -1883632914 108684414 1923417598 195370117 -97708220 1094455633 -1708211084 1592917537 546295717 1629211316 184774746 1565966644 -1780827222 -108478896 257785146 -812141980 225278727 1658249937 179345962 -1252867426 714580745 747089361 -1247457813 -1169954607 646163740 271626267 724245185 -2015252233 2123295751 702108647 1068906112 586427974 339668453 698874317 -427386347 -1070106515 -951984659 1350515447 -511649125 -1864824724 -54104282 118450557 -98886723 1500703353 -26493647 1841550910
+ s 60 ; array size
+
+.text
+ addi $5 $2 0x0 ; establish frame pointer
+ jmp MAIN
+
+
+;;; accepts two arguments, corresponding to offsets into `arr'
+;;; compares the corresponding values.
+;;; if the first index is greater than the second, swaps the two values
+;;; in place.
+SWAPPER:
+ push $5 ;function preamble
+ addi $5 $2 0x0
+ subi $2 $2 0x0
+
+ load $7 +2($5) ; access args
+ load $6 +1($5)
+
+ load $8 arr($7) ; index array
+ load $9 arr($6)
+
+ cmp $9 $8
+ bgt EXIT
+
+ store $9 arr($7) ; perform swap
+ store $8 arr($6)
+
+EXIT:
+ addi $2 $5 0x0 ;function postamble
+ pop $5
+ ret
+
+
+MAIN:
+ push $5 ;function preamble
+ addi $5 $2 0x0
+ subi $2 $2 0x4
+
+ load $6 s($0) ; inner loop termination condition
+ subi $7 $6 0x1 ; outer loop termination condition
+ addi $8 $0 0x0 ; outer loop iterator
+ jrl OCON
+O:
+ addi $9 $8 0x1 ; inner loop iterator
+ jrl ICON
+I:
+ store $9 -1($5) ; caller-saved registers
+ store $8 -2($5)
+ store $7 -3($5)
+ store $6 -4($5)
+
+ push $8
+ push $9 ; push args
+ jal SWAPPER
+ addi $2 $2 0x2 ; cleanup args
+
+ load $9 -1($5) ; restore registers
+ load $8 -2($5)
+ load $7 -3($5)
+ load $6 -4($5)
+ addi $9 $9 0x1
+ICON:
+ cmp $6 $9
+ bgt I
+ addi $8 $8 0x1
+OCON:
+ cmp $7 $8
+ bgt O
+ nop
+ nop
+ nop
+ nop