6. Istruzioni di confronto

Queste eseguono un’istruzione aritmetica o logica su due argomenti, scartando il risultato ma impostando i flag di condizione. Tipicamente vengono usate per testare valori di dati senza modificarli, prima di eseguire un salto condizionato.

6.1. Convenzioni del documento

Notazione: Rd, Rm, Rn indicano i registri ARM R0-R7. imm8 indica un valore immediato avente una larghezza di 8 bit.

6.2. L’Application Program Status Register (APSR)

Contiene quattro bit che vengono testati dalle istruzioni di salto condizionato. Tipicamente un salto condizionato testa più bit, ad esempio bge(LABEL). Il significato dei codici di condizione può dipendere dal fatto che gli operandi di un’istruzione aritmetica siano visti come interi con segno o senza segno. Quindi bhi(LABEL) presuppone che siano stati elaborati numeri senza segno, mentre bgt(LABEL) presuppone operandi con segno.

6.3. Bit dell’APSR

  • Z (zero)

Viene impostato se il risultato di un’operazione è zero o se gli operandi di un confronto sono uguali.

  • N (negativo)

Impostato se il risultato è negativo.

  • C (carry)

Un’addizione imposta il flag di riporto quando il risultato trabocca dal MSB, ad esempio sommando 0x80000000 e 0x80000000. Per la natura dell’aritmetica in complemento a due, questo comportamento è invertito nella sottrazione, con un prestito indicato dal bit di riporto azzerato. Quindi 0x10 - 0x01 viene eseguito come 0x10 + 0xffffffff, il che imposterà il bit di riporto.

  • V (overflow)

Il flag di overflow viene impostato se il risultato, visto come numero in complemento a due, ha il segno «sbagliato» rispetto agli operandi. Ad esempio sommando 1 a 0x7fffffff verrà impostato il bit di overflow, perché il risultato (0x80000000), visto come intero in complemento a due, è negativo. Nota che in questo caso il bit di riporto non viene impostato.

6.4. Istruzioni di confronto

Questi impostano i flag N (negativo), Z (zero), C (carry) e V (overflow) dell’APSR (Application Program Status Register).

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. Esecuzione condizionata

Le istruzioni it e ite forniscono un modo per eseguire condizionatamente da una a quattro istruzioni successive senza bisogno di un’etichetta.

  • it(<condition>) If then

Esegue l’istruzione successiva se <condition> è vera:

cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
  • ite(<condition>) If then else

Se <condition> è vera, esegue l’istruzione successiva, altrimenti esegue quella seguente. Quindi:

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

Questo può essere esteso per controllare l’esecuzione di un massimo di quattro istruzioni successive: it[x[y[z]]] dove x,y,z=t/e; ad esempio itt, itee, itete, ittte, itttt, iteee, ecc.