Programmablauf steuern: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „== Bedingungsloser Sprung == -> b label * 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…“ |
KKeine Bearbeitungszusammenfassung |
||
| 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. | |||
== Bedingungsloser Sprung == | == Bedingungsloser Sprung == | ||
Der Bedingunslose Sprung wird mit "b" (Branch) durchgeführt. Dies bedeutet, dass der Programmablauf an der mit Label bezeichnetet Stelle springt. | |||
Syntax: | |||
<syntaxhighlight lang="asm" inline>b label</syntaxhighlight> | |||
-> b label | -> b label | ||
* Bedingungsflags | * Bedingungsflags | ||
Version vom 3. April 2025, 09:41 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
-> b label
- 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