### Demo-Programm für MIPS für die Vorlesung ###
###        "Grundlagen der Informatik"       ###
###               Jörg Roth                  ###
###
### sort2: Sortiert zwei Speicherzellen, d.h. tauscht, wenn (wort1>wort2)
### sort3: Sortiert drei Speicherzellen, so dass danach (wort1<wort2<wort3)
### Es ruft dazu dreimal sort 2 auf mit den Kombinationen (wort1, wort2), (wort2, wort3), (wort1, wort2)
### Sind diese in der Reihenfolge paarweise sortiert worden, sind alle drei Speicherinhalte sortiert.

       .data
word1:  .word 4
word2:  .word 3
word3:  .word 2

       .text               
sort2:                     # Unterprogramm zum Sortieren von zwei Speicherinhalten
       lw $t0, 0($a0)      # 1. Wort in Register laden
       lw $t1, 0($a1)      # 2. Wort in Register laden
       slt $t2,$t0, $t1    # Vergleich Inhalte
       bne $zero,$t2,ret   # $t2=1, also $t0<$t1, dann nicht tauschen
       sw $t0, 0($a1)      # sonst umgekehrt zurückspeichern
       sw $t1, 0($a0)
ret:   jr $ra              # Rücksprung ins aufrufende Programm

sort3:                     # Unterprogramm zum Sortieren von drei Speicherinhalten
       addi $sp,$sp,-16    # Auf dem Stapel Platz für 4 Register freimachen
       sw $s0,0($sp)       # Sichern der Register $s0, $s1, $s2, $ra auf den Stapel
       sw $s1,4($sp)
       sw $s2,8($sp)
       sw $ra,12($sp)      # Wichtig: auch die Rücksprungadresse sichern

       move $s0,$a0        # Kopiere die drei Argumente in $s0, $s1, $s2
       move $s1,$a1
       move $s2,$a2

       jal sort2           # Sortiere Wort1 und Wort2

       move $a0,$s1
       move $a1,$s2
       jal sort2           # Sortiere Wort2 und Wort3

       move $a0,$s0
       move $a1,$s1
       jal sort2           # Sortiere nochmal Wort1 und Wort2 - damit sind alle 3 Wert sortiert

       lw $s0,0($sp)       # Zurücklesen der Register $s0, $s1, $s2, $ra von dem Stapel
       lw $s1,4($sp)
       lw $s2,8($sp)
       lw $ra,12($sp)
       addi $sp,$sp,16     # Stapelzeiger auf Wert vor dem Aufruf setzen
       jr $ra              # Rücksprung ins aufrufende Programm

main:                      # Einstiegspunkt des Programms
       la $a0,word1        # Sortieren von word1,
       la $a1,word2        # word2
       la $a2,word3        # und word3
       jal sort3           # Unterprogramm "sort3" aufrufen



