Schleifen in Assembler: Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
KKeine Bearbeitungszusammenfassung
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 4: Zeile 4:
C-Code:
C-Code:
<syntaxhighlight lang="C">
<syntaxhighlight lang="C">
for (int i = 0; i &lt; 10; i++) {
for (int i = 0; i < 10; i++) {
     // Schleifenrumpf
     // Schleifenrumpf
}
}
Zeile 21: Zeile 21:
loop_end:
loop_end:
</syntaxhighlight>
</syntaxhighlight>
== while-Schleife ==
== while-Schleife ==
C-Code:
C-Code:
Zeile 68: Zeile 69:
=== Initialisierung ===
=== 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.
Die Initialisierung der Schleifenvariable (z.B. <code>int i = 0;</code>) erfolgt meistens zu Beginn der Schleife mit einer MOV-Anweisung, um einen Wert in ein Register zu laden.
=== Bedingungsprüfung ===
=== 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.
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.
Basierend auf dem Vergleich wird mittels bedingter Sprunganweisungen (<code>BGE</code>, <code>BLT</code>, <code>BNE</code>, etc.) entschieden, ob die Schleife fortgesetzt oder beendet wird.


=== Schleifenrumpf ===
=== Schleifenrumpf ===
Zeile 80: Zeile 81:
=== Aktualisierung ===
=== Aktualisierung ===


Die Schleifenvariable wird typischerweise mit einer ADD- oder SUB-Anweisung inkrementiert oder dekrementiert.
Die Schleifenvariable wird typischerweise mit einer <code>ADD</code>- oder <code>SUB</code>-Anweisung inkrementiert oder dekrementiert.
=== Schleifenende und Neustart ===
=== Schleifenende und Neustart ===


Ein bedingungsloser Sprung (B) wird verwendet, um zurück zum Start der Schleife zu springen.
Ein bedingungsloser Sprung (<code>B</code>) 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.
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.

Aktuelle Version vom 24. September 2024, 11:42 Uhr

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.