Schleifen in MIPS Assembler umsetzen

In diesem Artikel soll es um die verschiedenen Schleifentypen und deren Umsetzung in MIPS Assembler gehen. Die Schleifen sehen in Assembler alle relativ gleich aus.

Für jeden Schleifentyp werde ich einen kleinen C-Code angeben, und diesen daraufhin in MIPS Assembler übersetzen.

For Schleife

Die wohl am weitesten verbreitete Schleife ist die sog. For-Schleife. Diese wird oft genutzt, um n-mal einen Befehlsblock auszuführen.

C-Code:

int i;
for(i = 0; i < 10; i++) {
//Mach was 10 mal
}

Wenn wir diese Schleife in MIPS Assembler übersetzen wollen, können wir das wie folgt tun:

MIPS ASM:

add $t0, $zero, $zero #$t0 = i = 0
addi $t1, $zero, 10 #$t1 = 10
for:
    bge $t0, $t1, endfor # IF ($t0 >= $t1) GOTO endfor
    #Befehle
    addi $t0, $t0, 1 #i++
    j for #GOTO for
endfor:
    #Weiter gehts

Wir müssen zunächst in zwei temporären Registern den Startwert von i bzw. die obere Grenze (10) festlegen. Als nächstes benötigen wir zwei Labels (for, endfor) zu denen wir springen können. In der For-Schleife prüfen wir zunächst, ob der Zähler größer gleich 10 ist. Ist dies der Fall, dann springen wir aus der Schleife zum Label „endfor“. Andernfalls werden die Befehle in der Schleife ausgeführt, und der Zähler inkrementiert, sowie wieder zum „for“-Label gesprungen.

While-Schleife

Mit einer While-Schleife kann man Befehle solange ausführen, bis eine bestimmte Abbruchbedingung eingetreten ist.

C-Code:

int sum = 0
while(sum < 20) {
sum = sum*2;
}

MIPS ASM:

add $t0, $zero, $zero #$t0 = sum = 0
addi $t1, $zero, 20 #$t1 = 20
while:
    bge $t0, $t1, endwhile #IF($t0 >= $t1) GOTO endwhile
    mult $t0, $t0, 2 #$t0 = $t0 * 2
    j while #GOTO while
endwhile:
#Weitere Befehle

Wie man hier erkennt, gibt es keinen großen Unterschied zur For-Schleife, außer das der Schleifenrumpf anderen Code enthält.

Repeat until bzw. Do while Schleifen

Bei diesem Schleifentyp wird die Prüfung des Schleifenkopfes am Ende des Schleifendurchlaufs ausgeführt, sodass die Schleife mindestens einmal durchlaufen wird. Dies können wir im Assembler  erreichen, in dem wir die „branch“-Anweisung nach dem Schleifenrumpf auswerten.

Fazit

In Assembler lassen sich Schleifen sehr leicht umsetzen, da sie immer auf dem gleichen Schema basieren, und es kaum Unterschiede zwischen diesen gibt.

~ Sebastian