7. Istruzioni di diramazione

Queste fanno saltare l’esecuzione a una posizione di destinazione solitamente specificata da un’etichetta (vedere la direttiva assembler label()). Le diramazioni condizionali e le istruzioni it e ite testano i flag N (negativo), Z (zero), C (riporto) e V (overflow) dell’Application Program Status Register (APSR) per determinare se la diramazione debba essere eseguita.

La maggior parte delle istruzioni assembler esposte (incluse le operazioni di spostamento) imposta i flag, ma esistono istruzioni di confronto esplicite per consentire il test dei valori.

Ulteriori dettagli sul significato dei flag di condizione sono forniti nella sezione istruzioni di confronto.

7.1. Convenzioni del documento

Notazione: Rm indica i registri ARM R0-R15. LABEL indica un’etichetta definita con la direttiva assembler label(). <condition> indica uno dei seguenti specificatori di condizione:

  • eq Uguale a (il risultato era zero)

  • ne Non uguale

  • cs Carry impostato

  • cc Carry azzerato

  • mi Minus (negativo)

  • pl Plus (positivo)

  • vs Overflow impostato

  • vc Overflow azzerato

  • hi > (confronto senza segno)

  • ls <= (confronto senza segno)

  • ge >= (confronto con segno)

  • lt < (confronto con segno)

  • gt > (confronto con segno)

  • le <= (confronto con segno)

7.2. Diramazione verso un’etichetta

  • b(LABEL) Diramazione incondizionata

  • beq(LABEL) dirama se uguale

  • bne(LABEL) dirama se non uguale

  • bge(LABEL) dirama se maggiore o uguale

  • bgt(LABEL) dirama se maggiore

  • blt(LABEL) dirama se minore (<) (con segno)

  • ble(LABEL) dirama se minore o uguale (<=) (con segno)

  • bcs(LABEL) dirama se il flag di carry è impostato

  • bcc(LABEL) dirama se il flag di carry è azzerato

  • bmi(LABEL) dirama se negativo

  • bpl(LABEL) dirama se positivo

  • bvs(LABEL) dirama se il flag di overflow è impostato

  • bvc(LABEL) dirama se il flag di overflow è azzerato

  • bhi(LABEL) dirama se maggiore (senza segno)

  • bls(LABEL) dirama se minore o uguale (senza segno)

7.3. Diramazioni lunghe

Il codice prodotto dalle istruzioni di diramazione elencate sopra usa una larghezza di bit fissa per specificare la destinazione della diramazione, che è relativa al PC. Di conseguenza, nei programmi lunghi in cui l’istruzione di diramazione è distante dalla sua destinazione, l’assembler produrrà un errore «branch not in range». Ciò può essere superato con le varianti «wide», come ad esempio

  • beq_w(LABEL) diramazione lunga se uguale

Le diramazioni wide usano 4 byte per codificare l’istruzione (rispetto ai 2 byte delle istruzioni di diramazione standard).

7.4. Subroutine (funzioni)

All’ingresso in una subroutine il processore memorizza l’indirizzo di ritorno nel registro r14, noto anche come link register (lr). Il ritorno all’istruzione successiva alla chiamata della subroutine viene effettuato aggiornando il program counter (r15 o pc) dal link register. Questo processo è gestito dalle istruzioni seguenti.

  • bl(LABEL)

Trasferisce l’esecuzione all’istruzione successiva a LABEL memorizzando l’indirizzo di ritorno nel link register (r14).

  • bx(Rm) Dirama all’indirizzo specificato da Rm.

Tipicamente bx(lr) viene emessa per tornare da una subroutine. Per le subroutine annidate, il link register degli scope esterni deve essere salvato (di solito sullo stack) prima di effettuare le chiamate alle subroutine interne.