Programmablauf steuern: Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
KKeine Bearbeitungszusammenfassung
Zeile 5: Zeile 5:
Syntax:
Syntax:
<syntaxhighlight lang="asm" inline>b label</syntaxhighlight>
<syntaxhighlight lang="asm" inline>b label</syntaxhighlight>
Beispiel:
<syntaxhighlight lang="asm">
.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
</syntaxhighlight>




-> b label
* Bedingungsflags
* Bedingungsflags
  negativ: N gesetzt, wenn Ergebnis negativ ist
  negativ: N gesetzt, wenn Ergebnis negativ ist

Version vom 3. April 2025, 09:58 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

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


  • 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