6. Vergleichsbefehle¶
Diese führen einen arithmetischen oder logischen Befehl auf zwei Argumenten aus, verwerfen das Ergebnis, setzen aber die Bedingungsflags. Typischerweise werden sie verwendet, um Datenwerte zu prüfen, ohne sie zu verändern, bevor ein bedingter Sprung ausgeführt wird.
6.1. Dokumentkonventionen¶
Notation: Rd, Rm, Rn bezeichnen die ARM-Register R0-R7. imm8 bezeichnet einen unmittelbaren Wert mit einer Breite von 8 Bits.
6.2. Das Application Program Status Register (APSR)¶
Dieses enthält vier Bits, die von den bedingten Sprungbefehlen geprüft werden. Typischerweise prüft ein bedingter Sprung mehrere Bits, zum Beispiel bge(LABEL). Die Bedeutung der Bedingungscodes kann davon abhängen, ob die Operanden eines arithmetischen Befehls als vorzeichenbehaftete oder vorzeichenlose Ganzzahlen betrachtet werden. So setzt bhi(LABEL) voraus, dass vorzeichenlose Zahlen verarbeitet wurden, während bgt(LABEL) vorzeichenbehaftete Operanden voraussetzt.
6.3. APSR-Bits¶
Z (Null)
Dies wird gesetzt, wenn das Ergebnis einer Operation null ist oder die Operanden eines Vergleichs gleich sind.
N (negativ)
Wird gesetzt, wenn das Ergebnis negativ ist.
C (Übertrag)
Eine Addition setzt das Übertragsflag, wenn das Ergebnis über das MSB hinaus überläuft, zum Beispiel beim Addieren von 0x80000000 und 0x80000000. Aufgrund der Natur der Zweierkomplement-Arithmetik ist dieses Verhalten bei der Subtraktion umgekehrt, wobei ein Borgen durch ein gelöschtes Übertragsbit angezeigt wird. So wird 0x10 - 0x01 als 0x10 + 0xffffffff ausgeführt, was das Übertragsbit setzt.
V (Überlauf)
Das Überlaufflag wird gesetzt, wenn das Ergebnis, als Zweierkomplementzahl betrachtet, das „falsche“ Vorzeichen im Verhältnis zu den Operanden hat. Beispielsweise setzt das Addieren von 1 zu 0x7fffffff das Überlaufbit, weil das Ergebnis (0x80000000), als Zweierkomplement-Ganzzahl betrachtet, negativ ist. Beachten Sie, dass in diesem Fall das Übertragsbit nicht gesetzt wird.
6.4. Vergleichsbefehle¶
Diese setzen die Flags N (negativ), Z (Null), C (Übertrag) und V (Überlauf) des APSR (Application Program Status Register).
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Bedingte Ausführung¶
Die Befehle it und ite bieten eine Möglichkeit, einen bis vier nachfolgende Befehle bedingt auszuführen, ohne dass ein Label erforderlich ist.
it(<condition>) If then
Den nächsten Befehl ausführen, wenn <condition> wahr ist:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else
Wenn <condition> wahr ist, den nächsten Befehl ausführen, andernfalls den darauffolgenden. Somit:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Dies lässt sich erweitern, um die Ausführung von bis zu vier nachfolgenden Befehlen zu steuern: it[x[y[z]]], wobei x,y,z=t/e; z. B. itt, itee, itete, ittte, itttt, iteee usw.