6. Instrucțiuni de comparare

Acestea efectuează o instrucțiune aritmetică sau logică pe doi operanzi, ignorând rezultatul, dar setând indicatorii de condiție. De obicei, acestea sunt folosite pentru a testa valori de date fără a le modifica înainte de executarea unei ramificări condiționate.

6.1. Convenții ale documentului

Notație: Rd, Rm, Rn denotă registrele ARM R0-R7. imm8 denotă o valoare imediată având o lățime de 8 biți.

6.2. Registrul de stare a programului aplicației (APSR)

Acesta conține patru biți care sunt testați de instrucțiunile de ramificare condiționată. De obicei, o ramificare condiționată va testa mai mulți biți, de exemplu bge(LABEL). Semnificația codurilor de condiție poate depinde de faptul dacă operanzii unei instrucțiuni aritmetice sunt priviți ca numere întregi cu semn sau fără semn. Astfel, bhi(LABEL) presupune că au fost prelucrate numere fără semn, în timp ce bgt(LABEL) presupune operanzi cu semn.

6.3. Biții APSR

  • Z (zero)

Acesta este setat dacă rezultatul unei operații este zero sau dacă operanzii unei comparații sunt egali.

  • N (negativ)

Setat dacă rezultatul este negativ.

  • C (transport)

O adunare setează indicatorul de transport atunci când rezultatul depășește dincolo de MSB, de exemplu adunând 0x80000000 și 0x80000000. Prin natura aritmeticii în complement față de doi, acest comportament este inversat la scădere, un împrumut fiind indicat de bitul de transport în starea ștearsă. Astfel, 0x10 - 0x01 este executat ca 0x10 + 0xffffffff, ceea ce va seta bitul de transport.

  • V (depășire)

Indicatorul de depășire este setat dacă rezultatul, privit ca un număr în complement față de doi, are semnul „greșit” în raport cu operanzii. De exemplu, adunarea lui 1 la 0x7fffffff va seta bitul de depășire deoarece rezultatul (0x80000000), privit ca un întreg în complement față de doi, este negativ. Rețineți că, în acest caz, bitul de transport nu este setat.

6.4. Instrucțiuni de comparare

Acestea setează indicatorii N (negativ), Z (zero), C (transport) și V (depășire) din APSR (Registrul de stare a programului aplicației).

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. Execuție condiționată

Instrucțiunile it și ite oferă un mijloc de a executa condiționat de la una până la patru instrucțiuni ulterioare, fără a fi nevoie de o etichetă.

  • it(<condition>) Dacă atunci

Execută următoarea instrucțiune dacă <condition> este adevărat:

cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
  • ite(<condition>) Dacă atunci altfel

Dacă <condition> este adevărat, execută următoarea instrucțiune, în caz contrar o execută pe cea ulterioară. Astfel:

cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here

Acest lucru poate fi extins pentru a controla execuția a până la patru instrucțiuni ulterioare: it[x[y[z]]] unde x,y,z=t/e; de exemplu itt, itee, itete, ittte, itttt, iteee, etc.