6. Instrukcje porównania¶
Wykonują one instrukcję arytmetyczną lub logiczną na dwóch argumentach, odrzucając wynik, ale ustawiając flagi warunku. Zazwyczaj są używane do testowania wartości danych bez ich zmiany, przed wykonaniem skoku warunkowego.
6.1. Konwencje dokumentu¶
Notacja: Rd, Rm, Rn oznaczają rejestry ARM R0-R7. imm8 oznacza wartość natychmiastową o szerokości 8 bitów.
6.2. Rejestr stanu programu aplikacji (APSR)¶
Zawiera on cztery bity, które są testowane przez instrukcje skoku warunkowego. Zazwyczaj skok warunkowy testuje wiele bitów, na przykład bge(LABEL). Znaczenie kodów warunków może zależeć od tego, czy operandy instrukcji arytmetycznej są traktowane jako liczby całkowite ze znakiem, czy bez znaku. Tak więc bhi(LABEL) zakłada, że przetwarzano liczby bez znaku, podczas gdy bgt(LABEL) zakłada operandy ze znakiem.
6.3. Bity APSR¶
Z (zero)
Jest ustawiany, gdy wynik operacji jest równy zero lub operandy porównania są równe.
N (negatywny)
Ustawiany, gdy wynik jest ujemny.
C (przeniesienie)
Dodawanie ustawia flagę przeniesienia, gdy wynik wykracza poza najbardziej znaczący bit (MSB), na przykład przy dodawaniu 0x80000000 i 0x80000000. Z natury arytmetyki uzupełnienia do dwóch zachowanie to jest odwrócone przy odejmowaniu, gdzie pożyczka jest sygnalizowana wyzerowaniem bitu przeniesienia. Tak więc 0x10 - 0x01 jest wykonywane jako 0x10 + 0xffffffff, co ustawi bit przeniesienia.
V (nadmiar)
Flaga nadmiaru jest ustawiana, gdy wynik, traktowany jako liczba w uzupełnieniu do dwóch, ma „zły” znak w stosunku do operandów. Na przykład dodanie 1 do 0x7fffffff ustawi bit nadmiaru, ponieważ wynik (0x80000000), traktowany jako liczba całkowita w uzupełnieniu do dwóch, jest ujemny. Zauważ, że w tym przypadku bit przeniesienia nie jest ustawiony.
6.4. Instrukcje porównania¶
Ustawiają one flagi N (negatywny), Z (zero), C (przeniesienie) i V (nadmiar) rejestru APSR (Application Program Status Register).
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Wykonanie warunkowe¶
Instrukcje it oraz ite zapewniają sposób warunkowego wykonania od jednej do czterech kolejnych instrukcji bez potrzeby stosowania etykiety.
it(<condition>) If then
Wykonaj następną instrukcję, jeśli <condition> jest prawdziwe:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else
Jeśli <condition> jest prawdziwe, wykonaj następną instrukcję, w przeciwnym razie wykonaj kolejną. Tak więc:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Można to rozszerzyć, aby sterować wykonaniem do czterech kolejnych instrukcji: it[x[y[z]]], gdzie x,y,z=t/e; np. itt, itee, itete, ittte, itttt, iteee itd.