Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Breve introduzione
v1.4 (29/5/2007) M.Moro DEI UNIPD
1. Il modello di programmazione
1.0 Memoria
ARM (Advanced Risc Machine) è un processore a 32 bit ma è in grado di manipolare dati da 8 bit (byte) e 16 bit (halfword)
(Fig. 1). In memoria questi dati sono ordinati di default secondo la convenzione little endian.
Le istruzioni che leggono byte o halfword da memoria eseguono un’estensione a 32 bit, diversa nel caso del trattamento di
valori con o senza segno.
Es.: LDRB R0, [R1]
Forma unsigned: carica in R0 il byte memorizzato all’indirizzo contenuto in R1. Il dato, prima di essere memorizzato
in R0, viene esteso in un word azzerandone i primi 24 bit.
Es.: LDRSB R0, [R1]
Forma signed: carica in R0 il byte memorizzato all’indirizzo contenuto in R1. Il dato, prima di essere memorizzato in
R0, viene esteso in un word estendendo il segno ai primi 24 bit.
In queste note la locazione di memoria all’indirizzo <expr> sarà indicata come B[<expr>] se byte (8 bit), H[<expr>] se
halfword (16 bit), W[<expr>] se word (32 bit).
3.0 Registri
Il processore ARM è dotato di 37 registri: 31 sono registri generici, 6 sono registri di stato (dei quali 5 sono di salvataggio).
Tre dei registri generali hanno anche un significato speciale: R13 (SP) viene utilizzato come Stack Pointer a supporto della
realizzazione di subroutine e routine di servizio, R14 (LR) viene utilizzato come Link Register per memorizzare l’indirizzo di
ritorno in una chiamata a subroutine (vedi istruzione BL), R15 (PC) è il Program Counter. I registri sono organizzati in banchi
parzialmente sovrapposti (Tabella 2), un banco di registri associato ad ogni processor mode (il modo System utilizza lo stesso
banco del modo User). Nel modo corrente sono visibili 15 registri d’uso generale (dal R0 al R14), uno o due registri di stato
(quello corrente ed eventualmente quello di salvataggio) ed il PC. Tutti i registri, tranne quelli di stato, possono essere utilizzati
1
da tutte le istruzioni di tipo generale.
Es.: Se il processore si trova nello stato “IRQ” (Interrupt), l’istruzione MOV PC, R14 copia il valore del registro R14 relativo
al modo “IRQ” (R14_irq) nel registro PC. Notare che R14_irq è fisicamente un registro diverso da R14 in modo “usr”,
nonostante vengano indicati dalla stessa sigla mnemonica.
Modo
User Supervisor Abort Undefined Interrupt Fast
(usr)/ (svc) (abt) (und) (IRQ) inturrupt
system (FIQ)
(sys)
R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8_FIQ
R9 R9 R9 R9 R9 R9_FIQ
R10 R10 R10 R10 R10 R10_FIQ
R11 R11 R11 R11 R11 R11_FIQ
R12 R12 R12 R12 R12 R12_FIQ
R13 R13_SVC R13_ABT R13_UNDEF R13_IRQ R13_FIQ
R14 R14_SVC R14_ABT R14_UNDEF R14_IRQ R14_FIQ
PC=R15 PC PC PC PC PC
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
M M M M M
N Z C V Riservati I F T 4 3 2 2 0
5.0 Stack
Lo stack è una struttura di tipo LIFO (Last-In First-Out) solitamente utilizzata dai microprocessori per salvare
momentaneamente i registri (o il contesto) prima dell’esecuzione di una subroutine o di una routine di servizio al fine di
garantirne la rientranza. Questo vale in particolare nel caso ARM per il registro LR che deve essere salvato (su uno stack)
prima che dall’interno di una subroutine se ne chiami un’altra, al fine di ottenere il corretto ripristino della successione di
indirizzi di ritorno alle subroutine chiamanti. I registri vengono salvati nello stack in una determinata sequenza, e recuperati
normalmente nella sequenza inversa. Come già detto, il registro SP (R13) viene convenzionalmente utilizzato per identificare
l'indirizzo della testa di uno stack in memoria che cresce per indirizzi decrescenti.
Nei processori ARM, gli stack vengono facilmente gestiti tramite le istruzioni LDM (Load Multiple Register) e STM (Store
Multiple Register). Quattro formati di stack diversi sono supportati (Tab.4, Fig. 3), ognuno dei quali può essere specificato
utilizzando un’appropriata sigla di due caratteri posposta al simbolo operativo LDM/STM. Gli stack possono essere di tipo
"full stack" o di tipo "empty stack" a seconda che SP punti rispettivamente all'ultimo dato inserito o alla prima posizione di
memoria libera (dopo l'ultimo dato inserito). Inoltre possono essere di tipo "ascendente" o "discendente" a seconda che SP
venga incrementato o decrementato per effetto dell'inserimento. Per ulteriori dettagli si veda la descrizione del modo di
indirizzamento 4 e delle due istruzioni LDM/STM.
3
Istruzione Modo d’indirizzamento Tipo di stack
LDM (Load) IA (Increment After) FD (Full Descending)
STM (Store) IA (Increment After) EA (Empty Ascending)
LDM (Load) IB (Increment Before) ED (Empty Descending)
STM (Store) IB (Increment Before) FA (Full Ascending)
LDM (Load) DA (Decrement After) FA (Full Ascending)
STM (Store) DA (Decrement After ) ED (Empty Descending)
LDM (Load) DB (Decrement Before) EA (Empty Ascending)
STM (Store) DB (Decrement Before) FD (Full Descending)
Tabella 4 - Tipi di istruzioni LDM/STM per stack
FA EA ED FD
Memoria
Bassa
SP SP
SP SP
Memoria
Alta
6.0 Eccezioni
Nel processore ARM sono previsti 7 tipi d’eccezione (un’ottavo tipo, Address Exception, citato nella tabella per completezza,
si riferisce ad una particolare modalità operativa con address space ridotto a 26 bit, in queste note non descritta). Associato a
ciascun tipo di eccezione v’è un indirizzo denominato ‘vettore d’eccezione’ (hard vector) (Tab. 5). L’elaborazione di una
eccezione, tra l’altro, forza il PC ad assumere il valore del corrispondente vettore. Di norma a quell’indirizzo è collocata
un’istruzione di salto alla corrispondente routine di servizio: solo per l’ultima eccezione (FIQ), non essendoci altri vettori che
seguono nella tabella, all’indirizzo del corrispondente vettore può direttamente iniziare la sua RSI.
4
; aggiorna il registro di stato col modo di processore.
CPSR[4:0] = <identificativo eccezione>
L’indirizzo di ritorno, salvato nel registro R14_<exception_mode> dipende dal tipo di eccezione:
- non prevedibile per l’eccezione ‘Reset’,
- è l’indirizzo dell’istruzione che ha provocato l’eccezione + 4 nei casi ‘Undefined Instruction’, ‘Software Interrupt’,
‘Prefetch Abort’;
- è l’indirizzo dell’istruzione che ha provocato l’eccezione + 8 nel caso ‘Data Abort’,
- è l’indirizzo della prossima istruzione nel codice interrotto + 4 nei casi IRQ e FIQ.
Pertanto, conclusa la routine di servizio, il ritorno al codice interrotto ha luogo eseguendo, con un'istruzione atomica, il
ripristino di CPSR e PC; ciò può essere attuato:
- utilizzando un’istruzione di elaborazione dati con destinazione PC e bit S impostato (si ricordi che le istruzioni ADDS
R15, Rn, SUBS R15, Rn, MOVS R15, Rn, oltre a caricare in R15 (PC) il valore di Rn, caricano nel CPSR il valore di
SPSR_<modo>;
- utilizzando l'istruzione di caricamento multiplo (LDM), specificando nella lista dei registri destinazione anche R15 (nel
qual caso viene anche caricato il valore di SPSR_<modo> nel CPSR).
Viene ora fornita una breve descrizione delle eccezioni e, per ciascuna, un esempio di istruzione di ritorno.
Reset
Eccezione generata dal fronte di discesa del segnale di reset: consente di inizializzare il processore (non è previsto un ritorno).
Undefined Instruction
Eccezione generata internamente alla CPU quando è stato eseguito il fetch di una codifica di istruzione non valida. Viene
talvolta utilizzata per emulare, con codifiche non valide, istruzioni aggiuntive realizzate via software
Es. istruzione di ritorno (all’istruzione emulata): MOVS PC, R14
Software Interrupt
Eccezione generata, come effetto principale, dall’apposita istruzione SWI (vedi descrizione dell’istruzione). La routine di
servizio assume di norma il ruolo di attivatore di una chiamata a sistema (operativo): il relativo codice viene pertanto eseguito
in modalità privilegiata.
Es. istruzione di ritorno: MOVS PC, R14
Prefetch Abort
Eccezione generata dal segnale di ingresso alla CPU "abort" nella fase di (pre)fetch di un’istruzione. Il segnale “abort”,
generalmente controllato dalla MMU (Memory Management Unit), viene generato nel tentativo di accedere ad un indirizzo di
memoria non valido. La RSI può essere utilizzata per l'implementazione della memoria virtuale.
Es. istruzione di ritorno (all’istruzione non caricata): SUBS PC, R14, #4
Data Abort
Come per ‘Prefetch Abort’ ma con segnale “abort” generato nella fase di esecuzione un’istruzione.
Es. istruzione di ritorno (all’istruzione non eseguita): SUBS PC, R14, #8
istruzione di ritorno (senza riesecuzione dell’istruzione): SUBS PC, R14, #4
5
2.0.0 Gestione delle priorità dei dispositivi
Essendo le linee d’ingresso IRQ e FIQ uniche, i dispositivi di ciascuna delle due classi di interruzioni (normali e fast) devono
essere identificati in una fase iniziale della rispettiva routine di servizio (che inizia al corrispondente vettore d’interruzione
0x18 e 0x1c). Al fine di velocizzare tale fase di identificazione, e gestire correttamente le priorità tra i dispositivi, il sistema
può includere hardware aggiuntivo (interrupt controller). La sua presenza evita una lunga fase di polling dei dispositivi
presenti: attraverso la lettura di appositi registri del/i dispositivo/i di controllo, la routine di servizio può immediatamente
identificare qual è, tra i dispositivi che hanno una richiesta pendente, quello più prioritario e passare il controllo alla
corrispondente RSI specifica.
Eccezione Priorità
Reset 1 (maggiore)
Data abort 2
FIQ 3
IRQ 4
Prefetch abort 5
Undef. Instr. SWI 6 (minore)
Tabella 6 - Priorità delle eccezioni
6
2. Modalità d’indirizzamento
Le modalità di indirizzamento, ovvero i diversi modi con cui gli operandi delle istruzioni possono essere specificati, sono
raggruppate in 5 sottoinsiemi detti ‘modi d’indirizzamento’ (addressing mode). Ciascuno dei modi si applica ad un certo
sottoinsieme di istruzioni. La classificazione aiuta ad associare a ciascuna istruzione le modalità di indirizzamento ammesse
per i suoi operandi.
Immediate #<immediate>
L’operando è un valore immediato (costante). Il valore <immediate> è un valore costante da 8-bit ruotato a destra di un
numero pari di posizioni (0,2,4,..,28,30) in una parola da 32 bit. Nella codifica si usano, pertanto, 8 bit per memorizzare il
valore da ruotare e 4 bit per memorizzare la metà del numero di posizioni di rotazione da applicare. Ne consegue che non tutti i
valori rappresentabili con 32 bit sono riconducibili ad un valore da 8 bit ruotato; in particolare non sono costruibili in questo
modo valori rappresentati in binario con più di 8 bit pari a 1.
Esempio di valore valido: 0xf000000f che equivale a 0xff ruotato a destra di 4 bit (in una parola da 32 bit).
Esempio di valore non valido: 0xfff non è valido in quanto composto da più di 8 bit pari 1.
Es.:
MOV R0, #0 ; carica in R0 il valore immediato 0x0
Register Rm
L’operando Rm è un registro di uso comune (da R0 a R15)
Es.:
MOV R0, R1 ; carica in R0 il contenuto di R1
MOV PC, LR ; carica nel PC il contenuto di LR (equivalente a RETURN)
7
Es.:
MOV R0, R1, LSR R2 ; R0 <- R1 / 2^R2 (unsigned)
L’indirizzo dell’operando di memoria viene calcolato, a seconda del segno specificato dopo il simbolo #, come
somma/sottrazione tra il contenuto di Rn (registro base) ed un <offset di 12 bit>. Se viene specificato un offset nullo,
l'indirizzo prodotto è pari al contenuto del registro Rn.
Es.:
LDR R0, [R1, #CAMPO] ; R0 <- W[R1 + CAMPO]
LDRB R0, [R1] ; R0 <- B[R1] offset nullo
8
Immediate pre-indexed [Rn, #+/-<offset di 12 bit>]!
L’indirizzo dell’operando di memoria viene calcolato, a seconda del segno specificato dopo il simbolo #, come
somma/sottrazione tra il contenuto di Rn (registro base) ed un <offset di 12 bit>. Se viene specificato un offset nullo,
l'indirizzo prodotto è pari al contenuto del registro Rn. L’indirizzo calcolato viene anche caricato come nuovo valore di Rn.
Es.:
LDR R0, [R1, #4]! ; R1 <- R1+4; R0 <- W[R1]
L’indirizzo dell’operando di memoria è rappresentato dal contenuto del registro base Rn. Successivamente viene calcolata, a
seconda del segno specificato dopo il simbolo #, la somma/sottrazione tra il contenuto di Rn ed un <offset di 12 bit> e caricata
come nuovo valore di Rn.
Es.:
LDR R0, [R1], #4 ; R0 <- W[R1]; R1 <- R1+4
L’indirizzo dell’operando di memoria viene calcolato, a seconda del segno specificato, come somma/sottrazione tra il
contenuto di Rn (registro base) ed di Rm (registro indice), che esprime un offset (non costante).
Es.:
LDR R0, [R1, R2] ; R0 <- W[R1+R2]
L’indirizzo dell’operando di memoria viene calcolato, a seconda del segno specificato, come somma/sottrazione tra il
contenuto di Rn (registro base) ed di Rm (registro indice), che esprime un offset (non costante). L’indirizzo calcolato viene
anche caricato come nuovo valore di Rn.
Es.:
LDR R0, [R1, R2]! ; R1 <- R1+R2; R0 <- W[R1]
L’indirizzo dell’operando di memoria è rappresentato dal contenuto del registro base Rn. Successivamente viene calcolata, a
seconda del segno specificato, la somma/sottrazione tra il contenuto di Rn ed di Rm (registro indice), che esprime un offset
(non costante), e caricata come nuovo valore di Rn.
Es.:
LDR R0, [R1], -R2 ; R0 <- W[R1]; R1 <- R1-R2
L’indirizzo dell’operando di memoria viene calcolato, a seconda del segno specificato, come somma/sottrazione tra il
contenuto di Rn (registro base) ed di Rm (registro indice), che esprime un offset (non costante), dopo aver operato su
quest’ultimo uno/a scorrimento/rotazione così come specificato dall’istruzione (per una descrizione di queste operazioni di
scorrimento/rotazione si veda il modo 1).
Es.:
LDR R0, [R1, -R2, LSL #1] ; R0 <- W[R1-R2*2]
L’indirizzo dell’operando di memoria viene calcolato, a seconda del segno specificato, come somma/sottrazione tra il
contenuto di Rn (registro base) ed di Rm (registro indice), che esprime un offset (non costante), dopo aver operato su
quest’ultimo uno/a scorrimento/rotazione così come specificato dall’istruzione (per una descrizione di queste operazioni di
9
scorrimento/rotazione si veda il modo 1). L’indirizzo calcolato viene anche caricato come nuovo valore di Rn.
Es.:
LDR R0, [R1, R2, LSL #1]! ; R1 <- R1+R2*2; R0 <- W[R1]
L’indirizzo dell’operando di memoria è rappresentato dal contenuto del registro base Rn. Successivamente viene calcolata, a
seconda del segno specificato, la somma/sottrazione tra il contenuto di Rn ed di Rm (registro indice), che esprime un offset
(non costante), dopo aver operato su quest’ultimo uno/a scorrimento/rotazione così come specificato dall’istruzione (per una
descrizione di queste operazioni di scorrimento/rotazione si veda il modo 1); il risultato di questo calcolo viene caricato come
nuovo valore di Rn.
Es.:
LDR R0, [R1], -R2, ASR #2 ; R0 <- W[R1]; R1 <- R1-R2/4
Questo modo viene utilizzato per specificare l’indirizzo di memoria nelle istruzioni di load e store da/verso memoria di
halfword da 16 bit (signed e unsigned) oppure di byte (8 bit) intesi come interi (signed). La distinzione tra signed e unsigned
nel caso di dati da 8 o da 16 bit è significativa nell’operazione di load su registro perché, nel caso signed, viene operata sul
valore da caricare un’estensione a 32 bit con segno, mentre nel caso unsigned l’estensione è operata con bit pari a 0. Le
modalità inserite in questa classe sono 6 e sono grossomodo le stesse del modo 2, ad esclusione delle versioni scaled, in questa
classe non incluse, e del valore di offset immediato che è codificato con 8 bit e non con 12. Per la descrizione delle modalità di
questa classe si faccia pertanto riferimento alle descrizioni del modo 2.
Es.:
LDRH R0, [R1, #0xF0] ; R0 <- H[R1+0xF0]
Questo modo viene utilizzato per specificare un sottoinsieme di registri sottoposti al caricamento/copia da/in memoria
mediante istruzioni di load/store multipli (LDM/STM). La convenzione adottata fissa l’ordine di copia in memoria:
procedendo per indirizzi crescenti, i registri vengono copiati in memoria per indice crescente (ad esempio, per il set R1, R4,
R5, R6, il registro R1 viene ad occupare l’indirizzo più basso, R6 quello più alto).
La lista dei registri può essere specificata in vari modi: si possono elencare uno ad uno i registri separati da virgole (es.: R0,
R1, R5), si può specificare un intervallo di registri (es.: R0-R4) oppure si possono combinare i due modi. L'ordine con cui
vengono specificati i registri è ininfluente: nella codifica e negli effetti prodotti viene comunque utilizzato un ordine
predefinito. Il contenuto del registro base definisce l’indirizzo di memoria rispetto al quale avviene il caricamento; il registro
viene modificato se è presente l’opzione ‘!’. Se nell’istruzione è presente l’opzione ‘^’, nella sua codifica viene impostato a 1 il
bit S: nel caso LDM e qualora nella lista di registri sia presente PC, questo provoca il caricamento di CPSR dal SPSR del modo
corrente; nel caso LDM che non coinvolga PC e in tutti i casi STM, l’impostazione del bit provoca, anche se in modo
privilegiato, il coinvolgimento dei registri del banco user nelle operazioni di caricamento/copia (non pertanto quelli del banco
relativo al modo privilegiato corrente).
10
Nelle ‘opzioni’ è possibile specificare se il caricamento o il salvataggio devono essere ascendenti (incremento a partire
dall'indirizzo base) o discendenti (decremento a partire dall'indirizzo base); è possibile specificare pure se
l’incremento/decremento dell’indirizzo debba avvenire prima o dopo che esso viene utilizzato per accedere alla locazione
corrente di memoria.
In questa modalità la successione di indirizzi di memoria è ottenuta partendo dal contenuto iniziale di Rn compreso
(corrisponde all’indirizzo più basso); gli indirizzi successivi al primo sono ottenuti con successivi incrementi di 4. Se è
presente l’opzione ‘!’, alla fine nel registro base Rn viene caricato l’ultimo indirizzo della successione + 4.
Es.:
STMIA R13, {R0-R7} ; W[R13] <- R0; W[R13+4] <- R1; ... W[R13+7*4] <- R7
In questa modalità la successione di indirizzi di memoria è ottenuta partendo dal contenuto iniziale di Rn+4 (corrisponde
all’indirizzo più basso); gli indirizzi successivi al primo sono ottenuti con successivi incrementi di 4. Se è presente l’opzione
‘!’, alla fine nel registro base Rn viene caricato l’ultimo indirizzo della successione.
Es.:
STMIB R13, {R0, R3} ; W[R13+4] <- R0; W[R13+8] <- R3
In questa modalità la successione di indirizzi di memoria è ottenuta partendo dal contenuto iniziale di Rn compreso
(corrisponde all’indirizzo più alto); gli indirizzi successivi al primo sono ottenuti con successivi decrementi di 4. Se è presente
l’opzione ‘!’, alla fine nel registro base Rn viene caricato il primo indirizzo (quello più basso) della successione - 4.
Es.:
LDMDA R13, {R4-R6} ; R4<-W[R13-8]; R5<-W[R13-4]; R6<-W[R13]
In questa modalità la successione di indirizzi di memoria è ottenuta partendo dal contenuto iniziale di Rn-4 (corrisponde
all’indirizzo più alto); gli indirizzi successivi al primo sono ottenuti con successivi decrementi di 4. Se è presente l’opzione ‘!’,
alla fine nel registro base Rn viene caricato il primo indirizzo (quello più basso) della successione.
Es.:
LDMDB R13, {R4, R6, R8} ; R4<-W[R13-12]; R6<-W[R13-8]; R8<-W[R13-4]
Per facilitare il trattamento di stack utilizzati per il salvataggio e ripristino dei registri macchina, possono essere utilizzati per il
modo 4 suffissi alternativi più vicini al significato delle operazioni su stack. I suffissi e le relative equivalenze sono illustrati in
tab. 7.
Questo modo viene utilizzato nelle istruzioni d’accesso ad un coprocessore (caricamento/salvataggio). Le 3 modalità incluse
nella classe producono una sequenza di indirizzi che consente al coprocessore di caricare/salvare da/in memoria dati di
ampiezza stabilita dal coprocessore stesso. La sequenza è ottenuta con incrementi successivi di 4 a partire dall’indirizzo
iniziale, calcolato in base alla modalità, e termina quando il coprocessore invia, durante il trasferimento, il segnale di fine. La
sequenza non può comunque essere composta da più di 16 word.
In questa modalità la successione di indirizzi di memoria è ottenuta partendo dall’indirizzo calcolato, a seconda del segno
specificato dopo il simbolo #, come somma/sottrazione tra il contenuto di Rn (registro base) ed un offset pari a <offset di 8
bit>*4.
Es.:
STC p8, CR9, [R2, #4] ; W[R2+4+4*i]<-p8[CR9] 0<=i<=max<16
; p8 identifica il coprocessore,
; CR9 un suo registro
In questa modalità la successione di indirizzi di memoria è ottenuta partendo dall’indirizzo calcolato, a seconda del segno
specificato dopo il simbolo #, come somma/sottrazione tra il contenuto di Rn (registro base) ed un offset pari a <offset di 8
bit>*4. Il primo indirizzo viene anche caricato come nuovo valore nel registro base Rn.
Es.:
STC p8, CR9, [R2,#4]! ; R2<-R2+4; W[R2+4*i]<-p8[CR9] 0<=i<=max<16
; p8 identifica il coprocessore,
; CR9 un suo registro
In questa modalità la successione di indirizzi di memoria è ottenuta partendo dall’indirizzo contenuto in Rn (registro base).
Successivamente viene calcolata, a seconda del segno specificato dopo il simbolo #, la somma/sottrazione tra il contenuto di
Rn ed un offset pari a <offset di 8 bit>*4, e caricata come nuovo valore del registro base Rn.
Es.:
STC p8, CR9, [R2], #4 ; W[R2+4*i]<-p8[CR9] 0<=i<=max<16; R2<-R2+4;
; p8 identifica il coprocessore,
; CR9 un suo registro
12
3. Le istruzioni
In questa sezione vengono illustrate le istruzioni dei processori ARM, corredate da sintassi e breve descrizione, divise in
categorie funzionali. Il suffisso di condizione (<cond>), che può essere aggiunto in talune istruzioni, esprime la condizione
booleana che deve essere verificata perché l’istruzione cui si applica venga effettivamente eseguita (vedi sez. 1.4). I bit di
condizione (contenuti nel registro di stato) per default non vengono alterati dalle istruzioni, a meno che il bit S (Set Condition
Codes) dell'istruzione non sia impostato ad 1. Questo si ottiene posponendo il suffisso S al simbolo operativo dell’istruzione
(ADDS, SUBEQS, RSCS, ecc.). Per le istruzioni CMP, CMN, TEQ e TST, il bit S è sempre attivo.
Somma il contenuto di Rn con <shifter_operand> e il valore del bit carry (C), e carica il risultato in Rd. Viene utilizzata di
solito per eseguire somme in precisione estesa (> 32 bit).
Es.:
; somma su 64 bit, R0-R1 primo operando, R2-R3 secondo operando
; in R4-R5 il risultato
ADDS R4, R0, R2 ; somma i bit meno significativi
ADC R5, R1, R3 ; somma i bit più significativi
Effettua un’operazione di and bit a bit tra il contenuto di Rn e lo <shifter_operand>, e carica il risultato in Rd.
Es.:
AND R0, R1, #0xff000000 ; ‘estrae’ i primi 8 bit da
; R1 e li memorizza in R0
Effettua un’operazione di and bit a bit tra il contenuto di Rn e il complemento a uno dello <shifter_operand>, e carica il
risultato in Rd. Interpretando lo <shifter_operand> come maschera, consente di azzerare singoli bit del contenuto di Rn.
Es.:
BIC R0, R0, #0xff000000 ; azzera i primi 8 bit di R0
13
Rn - ( -<shifter_operand> ) e impostando i bit di condizione in base al risultato.
Es.:
CMN R0, R1, LSL #1 ; imposta i bit cond. in base a R0+R1*2
Effettua un’operazione di or esclusivo bit a bit tra il contenuto di Rn e lo <shifter_operand>, e carica il risultato in Rd.
Interpretando lo <shifter_operand> come maschera, consente di invertire (negare) singoli bit del contenuto di Rn.
Es.:
EOR R0, R1, #6 ; R0 <- R1 con i bit di indice 1 e 2 negati
Moltiplica il contenuto del registro Rm col contenuto del registro Rs, somma il risultato al contenuto del registro Rn e carica il
risultato finale in Rd.
Es.:
MLA R3, R1, R2, R3 ; R3 <- R1 * R2 + R3
Carica nel registro Rd il contenuto di <shifter_operand>. Se modificati, i bit di condizioni vengono impostati in base al valore
caricato in Rd e al carry dello shifter.
Es.:
MOV R3, #0 ; R3 <- 0
Moltiplica il contenuto del registro Rm col quello del registro Rs e carica il risultato in Rd. Viene utilizzata per effettuare una
moltiplicazione di valori con o senza segno con risultato da 32 bit.
Es.:
MULEQ R0, R1, R2 ; se Z=1 allora R0 <- R1*R2
Carica nel registro Rd il negato (complemento a uno) del contenuto di <shifter_operand>. Se modificati, i bit di condizioni
vengono impostati in base al valore caricato in Rd e al carry dello shifter.
Es.:
MVN R3, #0 ; R3 <- NOT(0) = 0xffffffff = -1
Effettua un’operazione di or bit a bit tra il contenuto di Rn e lo <shifter_operand>, e carica il risultato in Rd. Interpretando lo
<shifter_operand> come maschera, consente di impostare a 1 singoli bit del contenuto di Rn.
Es.:
ORR R0, R0, 0x1 ; imposta a 1 il bit meno significativo di R0
Sottrae il contenuto di Rn allo <shifter_operand> e al risultato il negato del bit C, e carica il risultato finale in Rd. Viene
utilizzata di solito per eseguire differenze in precisione estesa (> 32 bit).
Es.:
; complemento a due su 64 bit
; R0 bit meno significativi, R1 bit più significativi
RSBS R2, R0, #0 ; R2 <- -R0, C <- ! prestito
RSC R3, R1, #0 ; R3 <- -R1 - !C
Sottrae ad Rn il contenuto di <shifter_operand> e, al risultato, il valore negato del bit carry (C); carica poi il risultato in Rd.
Viene utilizzata di solito per eseguire differenze in precisione estesa (> 32 bit).
Es.:
; differenza su 64 bit, R0-R1 primo operando, R2-R3 secondo operando
; in R4-R5 il risultato
SUBS R4, R0, R2 ; sottrae i bit meno significativi
SBC R5, R1, R3 ; sottrae i bit più significativi
Moltiplica il contenuto del registro Rm con quello del registro Rs e somma il risultato su 64 bit con segno al contenuto di
RdLo (32 bit meno significativi) e RdHi (32 bit più significativi), tenendo presente un eventuale riporto dalla somma della
parte meno significativa a quella più significativa. Viene utilizzata per effettuare una moltiplicazione di valori con segno con
risultato da 64 bit.
Es.:
SMLAL R0, R1, R3, R4 ; [R1 R0] <- [R1 R0] + R3*R4 con segno
15
SMULL Signed Multiply Long: SMULL{<cond>}{S} RdLo, RdHi, Rm, Rs
Se S=1 modifica i bit N,Z,C (non prevedibile), V (non prevedibile)
Moltiplica il contenuto del registro Rm col quello del registro Rs e carica il risultato su 64 bit con segno in RdLo (32 bit meno
significativi) e RdHi (32 bit più significativi). Viene utilizzata per effettuare una moltiplicazione di valori con segno con
risultato da 64 bit.
Es.:
SMULL R0, R1, R3, R4 ; [R1 R0] <- R3*R4 con segno
Confronta Rn con <shifter_operand>, eseguendo l’OR esclusivo bit a bit tra il contenuto di Rn e lo <shifter_operand>, e
impostando i bit di condizione in base al risultato. L’istruzione è adatta in particolare a verificare se i due operandi sono eguali
oppure se sono concordi.
Es.:
TEQ R0, R1, ROR #8 ; imposta i bit cond. in base a R0 XOR rotright(R1, 8)
Valuta alcuni bit di Rn, eseguendo l’AND bit a bit tra il contenuto di Rn e lo <shifter_operand>, e impostando i bit di
condizione in base al risultato. Interpretando lo <shifter_operand> come maschera, consente in particolare di valutare se i bit
selezionati dalla maschera sono tutti nulli o meno.
Es.:
TST R0, #3 ; imposta i bit cond. in base ai due bit meno significativi di R0
Moltiplica il contenuto del registro Rm col quello del registro Rs e somma il risultato su 64 bit senza segno al contenuto di
RdLo (32 bit meno significativi) e RdHi (32 bit più significativi), tenendo presente un eventuale riporto dalla somma della
parte meno significativa a quella più significativa. Viene utilizzata per effettuare una moltiplicazione di valori senza segno con
risultato da 64 bit..
Es.:
UMLAL R0, R1, R3, R4 ; [R1 R0] <- [R1 R0] + R3*R4 senza segno
Moltiplica il contenuto del registro Rm col quello del registro Rs e carica il risultato su 64 bit senza segno in RdLo (32 bit
meno significativi) e RdHi (32 bit più significativi). Viene utilizzata per effettuare una moltiplicazione di valori senza segno
con risultato da 64 bit..
Es.:
SMULL R0, R1, R3, R4 ; [R1 R0] <- R3*R4 senza segno
Carica nei registri indicati da <registers> il contenuto di successivi word di memoria. Per la trattazione dettagliata si veda la
sezione 2.4.
Es.:
LDMEQIA R1!, {R2-R4, R6} ; se Z=1 allora carica in R2, R3, R4 e R6
; il contenuto delle locazioni
; W[R1], W[R1+4], W[R1+8], W[R1+12], e
; R1 <- R1+16
Carica nel registro Rd il contenuto del byte di memoria il cui indirizzo è specificato con <addressing_mode>, interpretato
come valore da 8 bit unsigned, pertanto esteso su 32 bit con bit 0 prima di essere caricato in Rd. Per la trattazione dettagliata si
veda la sezione 2.2.
Es.:
LDRMIB R0, [R1] ; se N=1 allora R0 <- B[R1]
Carica nel registro Rd il contenuto dello halfword di memoria il cui indirizzo è specificato con <addressing_mode>,
interpretato come valore da 16 bit unsigned, pertanto esteso su 32 bit con bit 0 prima di essere caricato in Rd. Per la trattazione
dettagliata si veda la sezione 2.3.
Es.:
LDRCSH R0, [R1, #20] ; se C=1 allora R0 <- H[R1+20]
Carica nel registro Rd il contenuto del byte di memoria il cui indirizzo è specificato con <addressing_mode>, interpretato
come valore da 8 bit signed, pertanto esteso su 32 bit con segno prima di essere caricato in Rd. Per la trattazione dettagliata si
veda la sezione 2.3.
Es.:
LDRVCSB R0, [R1, #-10] ; se V=0 allora R0 <- ext32(B[R1-10])
Carica nel registro Rd il contenuto dello halfword di memoria il cui indirizzo è specificato con <addressing_mode>,
interpretato come valore da 16 bit signed, pertanto esteso su 32 bit con segno prima di essere caricato in Rd. Per la trattazione
dettagliata si veda la sezione 2.3.
Es.:
LDREQSH R0, [R1, R2]! ; se Z=1 allora R0 <- ext32(H[R1+R2]); R1 <- R1+R2
Copia il contenuto dei registri indicati da <registers> in successivi word di memoria. Per la trattazione dettagliata si veda la
sezione 2.4.
17
Es.:
STMNEDA R1, {R2-R4, R6} ; se Z=0 allora copia R2, R3, R4 e R6
; nelle locazioni
; W[R1], W[R1-4], W[R1-8], W[R1-12]
Copia il byte meno significativo contenuto in Rd nel byte di memoria il cui indirizzo è specificato con <addressing_mode>.
Per la trattazione dettagliata si veda la sezione 2.2.
Es.:
STRB R0, [R1, R2, LSL #1] ; B[R1+R2*2] <- R0B
Copia lo halfword meno significativo contenuto in Rd nello halfword di memoria il cui indirizzo è specificato con
<addressing_mode>. Per la trattazione dettagliata si veda la sezione 2.3.
Es.:
STRNEH R0, [R1], -R2 ; se Z=0 allora H[R1] <- R0H ; R1 <- R1-R2
Carica nel registro PC l’indirizzo ricavato dalla somma del PC corrente (indirizzo dell’istruzione Branch + 8) e del valore
dell’offset codificato nell’istruzione, premoltiplicato per 4.
Es.:
B LAB1 ; salta al label "LAB1"
Copia nel registro LR (R14) l’indirizzo di ritorno (indirizzo dell’istruzione BL + 4) e carica nel registro PC l’indirizzo ricavato
dalla somma del PC corrente (indirizzo dell’istruzione BL + 8) e del valore dell’offset codificato nell’istruzione,
premoltiplicato per 4.
Es.:
BLVC SUBR1 ; se V=0 chiama la subroutine “SUBR1”
18
4.0 Interruzione software ed altre istruzioni speciali
Copia in Rd il contenuto della copia attiva (quella relativa al modo di processore corrente) del registro di stato
(SPSR_<modo>). L’istruzione viene correttamente eseguita solo se il processore NON è in modo User o System.
MSR Move (Current) Status from Immediate: MSR{<cond>} CPSR_f, #32 bit immediate
Carica nel registro di stato corrente (CPSR) il valore immediato, codificato con una costante da 8 bit e una rotazione
(similmente alla modalità immediate del modo 1, vedi sez. 2.1). L’istruzione può essere usata solo per impostare i bit di
condizione in CPSR (31..24).
Carica nei campi specificati del registro di stato corrente (CPSR) i corrispondenti bit contenuti in Rm. I campi specificabili
<fields> sono: _c (control field, 7..0), _x (extension field, 15..8), _s (status field, 23..16), _f (flag field, 31..24). In modo User è
possibile modificare solo il campo _f (solo i bit di condizione; i bit 23..0 sono modificabili solo in modo privilegiato).
MSR Move (Saved) Status from Immediate: MSR{<cond>} SPSR_f, #32 bit immediate
Carica nella copia attiva nel modo corrente del registro di stato (SPSR_<modo>) il valore immediato, codificato con una
costante da 8 bit e una rotazione (similmente alla modalità immediate del modo 1, vedi sez. 2.1). L’istruzione può essere usata
solo in modalità diversa da User e System, e solo per impostare i bit di condizione in SPSR_<modo> (31..24).
Carica nei campi specificati della copia attiva nel modo corrente del registro di stato (SPSR_<modo>) i corrispondenti bit
contenuti in Rm. I campi specificabili <fields> sono: _c (control field, 7..0), _x (extension field, 15..8), _s (status field, 23..16),
_f (flag field, 31..24). L’istruzione può essere usata solo in modalità diversa da User e System.
Solleva l’eccezione SWI. È l’unico modo per passare esplicitamente da modo User a modo SVC. Consente di realizzare, nella
forma di routine di servizio dell’eccezione, una chiamata a sistema operativo. La selezione della chiamata può avvenire in base
al valore immediato codificato nell’istruzione o passando un parametro in altro modo. Per altri dettagli vedi sez. 1.6.
In un’unica operazione atomica, carica un word dalla locazione di memoria il cui indirizzo è contenuto in Rn, copia il
contenuto di Rm in quella locazione di memoria e carica in Rd il valore inizialmente letto dalla locazione. Se Rd == Rm,
l’istruzione effettua lo scambio dei contenuti del registro e della locazione di memoria. L’atomicità dell’operazione consente la
realizzazione di meccanismi di controllo (semafori) in architetture multiprocessore.
In un’unica operazione atomica, carica un byte dalla locazione di memoria il cui indirizzo è contenuto in Rn, copia il byte
meno significativo contenuto in Rm in quella locazione di memoria e carica in Rd l’estensione su 32 bit operata con bit 0 del
valore inizialmente letto dalla locazione. Se Rd == Rm, l’istruzione effettua lo scambio tra il byte meno significativo del
registro e il contenuto della locazione di memoria. L’atomicità dell’operazione consente la realizzazione di meccanismi di
controllo (semafori) in architetture multiprocessore.
Istruzioni di coprocessore
19
Consentono la comunicazione tra CPU ed altri PU (coprocessori) presenti nel sistema. Per load/store le modalità di
indirizzamento utilizzabili sono quelle del modo 5.
Vengono di norma eseguite in modo privilegiato in una routine di servizio di eccezione che emula una istruzione
inesistente. Dovendo emulare accessi in memoria che, se l’istruzione fosse effettivamente valida, avverrebero in modo
utente, il sistema di memoria viene notificato come se l’accesso avvenisse in modo utente e non nel modo corrente (che è
privilegiato).
Codice C
while(a != b)
if (a>b)
a -= b;
else
b -= a;
// in a il MCD
Codice assembly
20
@ a in R0, b in R1
LOOP: CMP R0, R1
SUBGT R0, R0, R1
SUBLT R1, R1, R0
BNE LOOP
@ in R0 il MCD
Codice assembly
@ a in R0, b in R1
CMP R0, #1
CMPNE R1, #2
ADDEQ R0, R0, #1
4.0.0 Jump table
Si debba saltare ad un punto di codice che dipende da un indice contenuto in R0. Gli indici validi vanno da 0 a MAX_INDEX-
1, CODESIZELOG2 rappresenta il massimo tra gli interi >= del logaritmo in base 2 della dimensione di ciascun segmento
relativo ai vari valori dell’indice. Si assume quindi questi segmenti siano collocati in successione ad una distanza in byte l’uno
dall’altro pari a CODESIZELOG2.
Una versione alternativa fa uso di una ‘tabella di salto’ (jump table) che contiene i singoli indirizzi nell’ordine dato dall’indice.
5.0.0 Semaforo
Una regione critica di codice può essere definita imponendo che, prima di iniziare la sua esecuzione, si acquisisca un ‘lock’
esclusivo rappresentato dal valore di un semaforo. Per consentire l’acquisizione indivisibile del lock da parte dei singoli
processi, ciò è realizzato utilizzando la speciale istruzione SWP.
21
INIZIO_SEZ_CRITICA:
MVN R2, #0 @ imposta lock in osservazione
WAIT1: SWP R3, R2, [R0] @ valuta ed eventualmente acquisisce lock
CMN R3, #1 @ attende se lock in osservazione da altri
BEQ WAIT1
@ lock acquisito da questo processo
CMP R3, #0 @ lock libero?
STRNE R3, [R0] @ no: riassegna il lock
@ al processo possessore e attende
BNE WAIT1
STR R1, [R0] @ lock libero, acquisisce
. . . @ sezione critica
. . .
FINE_SEZ_CRITICA:
WAIT2: SWP R3, R2, [R0] @ valuta lock
CMN R3, #1 @ attende se lock in osservazione da altri
BEQ WAIT2
CMP R3, R1 @ lock correttamente posseduto?
BNE SEMAFORO_CORROTTO @ stranamente non possiede il lock
MOV R2, #0 @ libera il lock
STR R2, [R0]
SWI_RSI:
STMFD SP!, {R12, ...} @ salva alcuni registri
LDR R12, [R14, #-4] @ carica la codifica di SWI
BIC R12, R12, 0xff000000 @ estrae campo immediato
CMP R12, #MAXSVC @ controllo range
LDRLE PC, [PC, R12, LSL #2] @ salta attraverso la tabella
B SVC_SCONOSCIUTO
.WORD SVC0
.WORD SVC1
. . .
.WORD SVC<MAXSVC-1>
22
ARM® and Thumb®-2 Instruction Set
Quick Reference Card
Key to Tables
Rm {, <opsh>} See Table Register, optionally shifted by constant <reglist> A comma-separated list of registers, enclosed in braces { and }.
<Operand2> See Table Flexible Operand 2. Shift and rotate are only available as part of Operand2. <reglist-PC> As <reglist>, must not include the PC.
<fields> See Table PSR fields. <reglist+PC> As <reglist>, including the PC.
<PSR> APSR (Application Program Status Register), CPSR (Current Processor Status Register), or SPSR <flags> Either nzcvq (ALU flags PSR[31:27]) or g (SIMD GE flags
(Saved Processor Status Register) PSR[19:16])
C*, V* Flag is unpredictable in Architecture v4 and earlier, unchanged in Architecture v5 and later. § See Table ARM architecture versions.
<Rs|sh> Can be Rs or an immediate shift value. The values allowed for each shift type are the same as those +/- + or –. (+ may be omitted.)
shown in Table Register, optionally shifted by constant. <iflags> Interrupt flags. One or more of a, i, f (abort, interrupt, fast interrupt).
x,y B meaning half-register [15:0], or T meaning [31:16]. <p_mode> See Table Processor Modes
<imm8m> ARM: a 32-bit constant, formed by right-rotating an 8-bit value by an even number of bits. SPm SP for the processor mode specified by <p_mode>
Thumb: a 32-bit constant, formed by left-shifting an 8-bit value by any number of bits, or a bit <lsb> Least significant bit of bitfield.
pattern of one of the forms 0xXYXYXYXY, 0x00XY00XY or 0xXY00XY00. <width> Width of bitfield. <width> + <lsb> must be <= 32.
<prefix> See Table Prefixes for Parallel instructions {X} RsX is Rs rotated 16 bits if X present. Otherwise, RsX is Rs.
{IA|IB|DA|DB} Increment After, Increment Before, Decrement After, or Decrement Before. {!} Updates base register after data transfer if ! present (pre-indexed).
IB and DA are not available in Thumb state. If omitted, defaults to IA. {S} Updates condition flags if S present.
<size> B, SB, H, or SH, meaning Byte, Signed Byte, Halfword, and Signed Halfword respectively. {T} User mode privilege if T present.
SB and SH are not available in STR instructions. {R} Rounds result to nearest if R present, otherwise truncates result.
Preload data or instruction §(PLD) §(PLI) §(PLDW) Assembler Action if <op> is PLD Action if <op> is PLI Action if <op> is PLDW Notes
Immediate offset 5E 7 7MP <op> [Rn {, #<offset>}] Preload [address, 32] (data) Preload [address, 32] (instruction) Preload to Write [address, 32] (data) 1, C
Register offset 5E 7 7MP <op> [Rn, +/-Rm {, <opsh>}] Preload [address, 32] (data) Preload [address, 32] (instruction) Preload to Write [address, 32] (data) 3, C
PC-relative 5E 7 <op> <label> Preload [label, 32] (data) Preload [label, 32] (instruction) 5, C
Notes: availability and range of options for Load, Store, and Preload operations
Note ARM Word, B, D ARM SB, H, SH ARM T, BT Thumb-2 Word, B, SB, H, SH, D Thumb-2 T, BT, SBT, HT, SHT
1 offset: – 4095 to +4095 offset: –255 to +255 Not available offset: –255 to +255 if writeback, –255 to +4095 otherwise offset: 0 to +255, writeback not allowed
2 offset: – 4095 to +4095 offset: –255 to +255 offset: – 4095 to +4095 offset: –255 to +255 Not available
3 Full range of {, <opsh>} {, <opsh>} not allowed Not available <opsh> restricted to LSL #<sh>, <sh> range 0 to 3 Not available
4 Full range of {, <opsh>} {, <opsh>} not allowed Full range of {, <opsh>} Not available Not available
5 label within +/– 4092 of current instruction Not available Not available label within +/– 4092 of current instruction Not available
6 offset: –255 to +255 - - offset: –1020 to +1020, must be multiple of 4. -
7 {, <opsh>} not allowed - - Not available -
8 label within +/– 252 of current instruction - - Not available -
9 Rd1 even, and not r14, Rd2 == Rd1 + 1. - - Rd1 != PC, Rd2 != PC -
10 Rm1 even, and not r14, Rm2 == Rm1 + 1. - - Rm1 != PC, Rm2 != PC -
ARM and Thumb-2 Instruction Set
Quick Reference Card
Coprocessor operations § Assembler Action Notes
Data operations CDP{2} <copr>, <op1>, CRd, CRn, CRm{, <op2>} Coprocessor defined C2
Move to ARM register from coprocessor MRC{2} <copr>, <op1>, Rd, CRn, CRm{, <op2>} Coprocessor defined C2
Two ARM register move 5E MRRC <copr>, <op1>, Rd, Rn, CRm Coprocessor defined
Alternative two ARM register move 6 MRRC2 <copr>, <op1>, Rd, Rn, CRm Coprocessor defined C
Move to coproc from ARM reg MCR{2} <copr>, <op1>, Rd, CRn, CRm{, <op2>} Coprocessor defined C2
Two ARM register move 5E MCRR <copr>, <op1>, Rd, Rn, CRm Coprocessor defined
Alternative two ARM register move 6 MCRR2 <copr>, <op1>, Rd, Rn, CRm Coprocessor defined C
Loads and stores, pre-indexed <op>{2} <copr>, CRd, [Rn, #+/-<offset8*4>]{!} op: LDC or STC. offset: multiple of 4 in range 0 to 1020. Coprocessor defined C2
Loads and stores, zero offset <op>{2} <copr>, CRd, [Rn] {, 8-bit copro. option} op: LDC or STC. Coprocessor defined C2
Loads and stores, post-indexed <op>{2} <copr>, CRd, [Rn], #+/-<offset8*4> op: LDC or STC. offset: multiple of 4 in range 0 to 1020. Coprocessor defined C2
Notes
A Not available in Thumb state. P Rn can be the PC in Thumb state in this instruction.
B Can be conditional in Thumb state without having to be in an IT block. Q Sets the Q flag if saturation (addition or substraction) or overflow (multiplication) occurs. Read and
reset the Q flag using MRS and MSR.
C Condition codes are not allowed in ARM state. R <sh> range is 1-32 in the ARM instruction.
C2 The optional 2 is available from ARMv5. It provides an alternative operation. Condition codes are not S The S modifier is not available in the Thumb-2 instruction.
allowed for the alternative form in ARM state.
D Deprecated. Use LDREX and STREX instead. T Not available in ARM state.
G Updates the four GE flags in the CPSR based on the results of the individual operations. U Not allowed in an IT block. Condition codes not allowed in either ARM or Thumb state.
I IA is the default, and is normally omitted. V The assembler inserts a suitable instruction if the NOP instruction is not available.
L ARM: <imm8m>. 16-bit Thumb: multiple of 4 in range 0-1020. 32-bit Thumb: 0-4095.
N Some or all forms of this instruction are 16-bit (Narrow) instructions in Thumb-2 code. For details
see the Thumb 16-bit Instruction Set (UAL) Quick Reference Card.
ARM and Thumb-2 Instruction Set
Quick Reference Card
ARM architecture versions Condition Field
n ARM architecture version n and above Mnemonic Description Description (VFP)
nT, nJ T or J variants of ARM architecture version n and above EQ Equal Equal
5E ARM v5E, and 6 and above NE Not equal Not equal, or unordered
T2 All Thumb-2 versions of ARM v6 and above CS / HS Carry Set / Unsigned higher or same Greater than or equal, or unordered
6K ARMv6K and above for ARM instructions, ARMv7 for Thumb CC / LO Carry Clear / Unsigned lower Less than
7MP ARMv7 architectures that implement Multiprocessing Extensions MI Negative Less than
Z All Security extension versions of ARMv6 and above PL Positive or zero Greater than or equal, or unordered
RM ARMv7-R and ARMv7-M only VS Overflow Unordered (at least one NaN operand)
XS XScale coprocessor instruction VC No overflow Not unordered
HI Unsigned higher Greater than, or unordered
Flexible Operand 2 LS Unsigned lower or same Less than or equal
Immediate value #<imm8m> GE Signed greater than or equal Greater than or equal
Register, optionally shifted by constant (see below) Rm {, <opsh>} LT Signed less than Less than, or unordered
Register, logical shift left by register Rm, LSL Rs GT Signed greater than Greater than
Register, logical shift right by register Rm, LSR Rs LE Signed less than or equal Less than or equal, or unordered
Register, arithmetic shift right by register Rm, ASR Rs AL Always (normally omitted) Always (normally omitted)
Register, rotate right by register Rm, ROR Rs All ARM instructions (except those with Note C or Note U) can have any one of these condition codes after the
instruction mnemonic (that is, before the first space in the instruction as shown on this card). This condition is
encoded in the instruction.
Register, optionally shifted by constant All Thumb-2 instructions (except those with Note U) can have any one of these condition codes after the
instruction mnemonic. This condition is encoded in a preceding IT instruction (except in the case of
(No shift) Rm Same as Rm, LSL #0 conditional Branch instructions). Condition codes in instructions must match those in the preceding IT
Logical shift left Rm, LSL #<shift> Allowed shifts 0-31 instruction.
On processors without Thumb-2, the only Thumb instruction that can have a condition code is B <label>.
Logical shift right Rm, LSR #<shift> Allowed shifts 1-32
Arithmetic shift right Rm, ASR #<shift> Allowed shifts 1-32
Rotate right Rm, ROR #<shift> Allowed shifts 1-31
Rotate right with extend Rm, RRX Processor Modes Prefixes for Parallel Instructions
16 User S Signed arithmetic modulo 28 or 216, sets CPSR GE bits
PSR fields (use at least one suffix) 17 FIQ Fast Interrupt Q Signed saturating arithmetic
Suffix Meaning 18 IRQ Interrupt SH Signed arithmetic, halving results
c Control field mask byte PSR[7:0] 19 Supervisor U Unsigned arithmetic modulo 28 or 216, sets CPSR GE bits
f Flags field mask byte PSR[31:24] 23 Abort UQ Unsigned saturating arithmetic
s Status field mask byte PSR[23:16] 27 Undefined UH Unsigned arithmetic, halving results
x Extension field mask byte PSR[15:8] 31 System
Operandi immediati:
MOV r0, r1 ; r0 r1
ADDNE r1, r1, r0 ; r1 r1 + r0 se flag Z è zero
MOVN r0, r1 ; r0 not(r1)
Condition codes Control flow instructions
Oltre all’esecuzione condizionale (vista in precedenza)
Op c o de Mn e mo ni c In t e rp re t at i o n S t at us f l ag s t at e f o r esistono istruzioni (B) di salto (sia incondizionato che
[3 1 :2 8 ] ex tens i on e x e c ut i o n
0000 EQ Equal / equals zero Z set
condizionato):
0001 NE Not equal Z clear
0010 CS/HS Carry set / unsigned higher or same C set
0011 CC/LO Carry clear / unsigned lower C clear B LABEL ; salta (incondizionato) a LABEL (24 bit)
0100 MI Minus / negative N set
0101 PL Plus / positive or zero N clear
BCOND ; salta (condizionato) a LABEL (24 bit)
0110 VS Overflow V set
0111 VC No overflow V clear
1000 HI Unsigned higher C set and Z clear Le condizioni valutabili dalle istruzioni di salto
1001 LS Unsigned lower or same C clear or Z set
1010 GE Signed greater than or equal N equals V condizionato sono mostrate nella pagina successiva.
1011 LT Signed less than N is not equal to V
1100 GT Signed greater than Z clear and N equals V Ovviamente è possibile anche la Branch and Link
1101 LE Signed less than or equal Z set or N is not equal to V
(indirizzo di ritorno in r14):
1110 AL Always any
1111 NV Never (do not use!) none