Programmablauf steuern: Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
Zeile 1: Zeile 1:
Grundsätzlich besteht die Programmierung aus vielen wenn/dann Abfragen. Der Ablauf des Programms wird auf bestimmte Bedingungen gesteuert. hier gibt es unter dem ARM-64-Assembler einige BEfehle, wie Bedingte und unbedingte Sprungbefehle: b, bl, cbz, cbnz, die für solche Zwecke verwendet werden können. In diesem Abschnitt erkläre ich, wie diese Verwendet werden kann. In Beispielen erkläre ich noch, wie man bestimmte Anforderungen, wie FOR/NEXT-, WHILE-, DO/UNTIL-Schleifen und IF/ELSE-Abfragen in Assembler abbilden kann.  
Grundsätzlich besteht die Programmierung aus vielen wenn/dann Abfragen. Der Ablauf des Programms wird auf bestimmte Bedingungen gesteuert. hier gibt es unter dem ARM-64-Assembler einige BEfehle, wie Bedingte und unbedingte Sprungbefehle: b, bl, cbz, cbnz, die für solche Zwecke verwendet werden können. In diesem Abschnitt erkläre ich, wie diese Verwendet werden kann. In Beispielen erkläre ich noch, wie man bestimmte Anforderungen, wie FOR/NEXT-, WHILE-, DO/UNTIL-Schleifen und IF/ELSE-Abfragen in Assembler abbilden kann.  
== Bedingungsloser Sprung ==
== Bedingungsloser Sprung ==
=== b (Branch) ===
Der Bedingunslose Sprung wird mit "b" (Branch) durchgeführt. Dies bedeutet, dass der Programmablauf an der mit Label bezeichnetet Stelle springt.
Der Bedingunslose Sprung wird mit "b" (Branch) durchgeführt. Dies bedeutet, dass der Programmablauf an der mit Label bezeichnetet Stelle springt.


Zeile 21: Zeile 22:
     svc 0            // system call
     svc 0            // system call
</syntaxhighlight>
</syntaxhighlight>
=== bl (Branch with link) ===
Ein anderer bedingungsloser Sprung ist <syntaxhighlight lang="asm" inline>bl</syntaxhighlight>. Dieser wird verwendet, wenn man in ein Unterprogramm springen möchte. Wenn dieser Befehl aufgerufen wird, wird in x30 der darauffolgende Befehl (Adresse) übergeben. Dies ist sehr nützlich, um in Unterprogrammen, wieder zurück zu kommen.
Syntax:
<syntaxhighlight lang="asm" inline>bl label</syntaxhighlight>
Beispiel:
<syntaxhighlight lang="asm">
.global _start
_start:
    mov x0, #5      // Setze x0 auf 5
    mov x1, #6      // Setze x1 auf 6
    bl Unterprogramm1 // Springe in das Unterprogramm
    // Programm beenden
    mov x8, #93      // exit system call
    svc 0            // system call
Unterprogramm1:
    mov x1, #100      // Überschreibe x1 mit 100
    ret            // springe zurück zum Hauptprogramm
</syntaxhighlight>





Version vom 3. April 2025, 10:09 Uhr

Grundsätzlich besteht die Programmierung aus vielen wenn/dann Abfragen. Der Ablauf des Programms wird auf bestimmte Bedingungen gesteuert. hier gibt es unter dem ARM-64-Assembler einige BEfehle, wie Bedingte und unbedingte Sprungbefehle: b, bl, cbz, cbnz, die für solche Zwecke verwendet werden können. In diesem Abschnitt erkläre ich, wie diese Verwendet werden kann. In Beispielen erkläre ich noch, wie man bestimmte Anforderungen, wie FOR/NEXT-, WHILE-, DO/UNTIL-Schleifen und IF/ELSE-Abfragen in Assembler abbilden kann.

Bedingungsloser Sprung

b (Branch)

Der Bedingunslose Sprung wird mit "b" (Branch) durchgeführt. Dies bedeutet, dass der Programmablauf an der mit Label bezeichnetet Stelle springt.

Syntax: b label

Beispiel:

.global _start

_start:
    mov x0, #5       // Setze x0 auf 5
    mov x1, #6       // Setze x1 auf 6
    b Label1
    mov x1,#10       //wird übergangen, da Branch auf Label1 springt
Label1:
    // x1 bleibt auf #6
    // Programm beenden
    mov x8, #93      // exit system call
    svc 0            // system call

bl (Branch with link)

Ein anderer bedingungsloser Sprung ist bl. Dieser wird verwendet, wenn man in ein Unterprogramm springen möchte. Wenn dieser Befehl aufgerufen wird, wird in x30 der darauffolgende Befehl (Adresse) übergeben. Dies ist sehr nützlich, um in Unterprogrammen, wieder zurück zu kommen.

Syntax: bl label

Beispiel:

.global _start

_start:
    mov x0, #5       // Setze x0 auf 5
    mov x1, #6       // Setze x1 auf 6
    bl Unterprogramm1 // Springe in das Unterprogramm
    // Programm beenden
    mov x8, #93      // exit system call
    svc 0            // system call

Unterprogramm1:
    mov x1, #100      // Überschreibe x1 mit 100
    ret            // springe zurück zum Hauptprogramm



  • Bedingungsflags
negativ: N gesetzt, wenn Ergebnis negativ ist
zero: z gesetzt wenn Ergebnis null ist
carry: c gesetzt, wenn es einen Überlauf gab. add -> wenn größer als Zahlenbereich (Überlauf), Subtraktion gesetzt, wenn Ergebnis keine Ausleihe. bei Verschieben letzte Bit herausgeschoben.
overflow: o gesetzt bei addition und subtraktion, wenn Ergebnis größer oder gleich 2^31, oder kleiner -2^31  

Flags werden im NZCV-Systemregister gespeichert

  • Verzweigung bei Bedingung

-> b.{condition} {condition} Flags Meaning EQ Z set Equal NE Z clear Not equal CS or HS C set Higher or same (unsigned >=) CC or LO C clear Lower (unsigned <) MI N set Negative PL N clear Positive or zero VS V set Overflow VC V clear No overflow HI C set and Z clear Higher (unsigned >) LS C clear and Z set Lower or same (unsigned <=) GE N and V the same Signed >= LT N and V differ Signed < GT Z clear, N and V the same Signed > LE Z set, N and V differ Signed <= AL Any Always (same as no suffix)

  • CMP Xn,Operand2

-> subtrahiert Operand2 von Xn

  • Schleifen
    • FOR NEXT
for i = 1 to 10
  Mache etwas
next i

In Assembler:

  mov w2,#1  //i=1
loop:
  //Mache etwas
  add w2,w2,#1 // i=i+1
  cmp w2,#10   // if i<10
  b.le loop    // then goto loop
    • WHILE
while x < 10
  Mache etwas
end while

In Assembler:

 // w2 zuvor initialisiert -> x
 loop:
   cmp w2,#10
   b.ge loopend
   // Mache etwas
   b loop
 loopend:
    • if/then/else
if x < 10 then
   If ist okay
else
   else kommt zum zuge
end if

In Assembler:

 // wert x in w2
 cmp w2,#10
 b.ge label_else
   //If ist okay
   b label_EndIf

label_else:

   //else kommt zum zuge

label_EndIf:

    • do/until
do
  Mache etwas
until a==0

In Assembler:

  mov w0,#1
loop:
  //mache etwas
  cmp w0,#0
  b.ne loop