Programmablauf steuern
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
Bedingter Sprung
Bedingte Sprünge werden verwendet, wenn auf bestimmte Ergebnisse reagiert werden soll. Hierfür wird das NZCV-Systemregister verwendet, welches Flags enthält, auf die hier getestet werden können.
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
Verzweigung bei Bedingung
Für die Verzweigung mit Bedingungen, wird wiederrum "b" verwendet, allerdings wird im eine Bedingung mit übergeben:
Syntax:
b.{condition} label
Folgende "conditions" sind möglich:
| {condition} | FLAGs | Bedeutung |
|---|---|---|
| EQ | Z gesetzt | gleich |
| NE | Z nicht gesetzt | ungleich |
| CS oder HS | C gesetzt | größer oder gleich (Vorzeichenlos) |
| CC oder LO | C nicht gesetzt | kleiner (Vorzeichenlos) |
| MI | N gesetzt | negativ |
| PL | N nicht gesetzt | positiv oder Null |
| VS | V gesetzt | Überlauf |
| VC | V nicht gesetzt | Kein Überlauf |
| HI | C gesetzt Z nicht gesetzt |
größer (Vorzeichenlos) |
| Beispiel | Beispiel | Beispiel |
| Beispiel | Beispiel | Beispiel |
| Beispiel | Beispiel | Beispiel |
| Beispiel | Beispiel | Beispiel |
| Beispiel | Beispiel | Beispiel |
| Beispiel | Beispiel | Beispiel |
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)
hi unsigned higher (C=1) and (Z=0)
ls unsigned lower or same (C=0) or (Z=1)
ge signed greater than or equal N=V
lt signed less than N!=V
gt signed greater than (Z=0) and (N=V)
le signed less than or equal (Z=1) or (N!=V)
- 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