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.