Schleifen in Assembler

Aus C und Assembler mit Raspberry

Schleifen sind in der C-Programmierung ein grundlegendes Konstrukt zur wiederholten Ausführung eines Codeblocks. Die wichtigsten Schleifentypen in C sind for, while und do-while. Hier zeige ich, wie du diese Schleifen in ARM64-Assembler umsetzen kannst.

for-Schleife

C-Code:

for (int i = 0; i < 10; i++) {
    // Schleifenrumpf
}

ARM64-Assembler:

mov w0, #0         // i = 0
loop_start:
    cmp w0, #10        // i < 10?
    bge loop_end       // If i >= 10, exit loop

    // Schleifenrumpf

    add w0, w0, #1     // i++
    b loop_start       // Go back to the start of the loop
loop_end:

while-Schleife

C-Code:

int i = 0;
while (i < 10) {
    // Schleifenrumpf
    i++;
}

ARM64-Assembler:

mov w0, #0         // i = 0
loop_start:
    cmp w0, #10        // i < 10?
    bge loop_end       // If i >= 10, exit loop

    // Schleifenrumpf

    add w0, w0, #1     // i++
    b loop_start       // Go back to the start of the loop
loop_end:

do-while-Schleife

C-Code:

int i = 0;
do {
    // Schleifenrumpf
    i++;
} while (i < 10);

ARM64-Assembler:

mov w0, #0         // i = 0
loop_start:

    // Schleifenrumpf

    add w0, w0, #1     // i++
    cmp w0, #10        // i < 10?
    blt loop_start     // If i < 10, continue loop

Erklärung

Initialisierung

Die Initialisierung der Schleifenvariable (z.B. int i = 0;) erfolgt meistens zu Beginn der Schleife mit einer MOV-Anweisung, um einen Wert in ein Register zu laden.

Bedingungsprüfung

Die Bedingungen werden in der Regel mit einer CMP-Anweisung geprüft, welche zwei Registerinhalt oder ein Registerinhalt mit einer unmittelbaren Konstante vergleicht.

Basierend auf dem Vergleich wird mittels bedingter Sprunganweisungen (BGE, BLT, BNE, etc.) entschieden, ob die Schleife fortgesetzt oder beendet wird.

Schleifenrumpf

Dieser Teil enthält den eigentlichen Code, der wiederholt ausgeführt wird.

Aktualisierung

Die Schleifenvariable wird typischerweise mit einer ADD- oder SUB-Anweisung inkrementiert oder dekrementiert.

Schleifenende und Neustart

Ein bedingungsloser Sprung (B) wird verwendet, um zurück zum Start der Schleife zu springen.

Diese Beispiele bieten einen grundlegenden Einstieg in die Implementierung von Schleifen in ARM64-Assembler. Die genaue Umsetzung hängt oft vom spezifischen Anwendungsfall und der gewünschten Optimierung ab.