L'architettura ARM
In questa pagina 6
In questa pagina 3
ARM è un'architettura RISCMotivazioni del CISC (divario semantico) e dati sull'esecuzione dei programmi; caratteristiche delle architetture RISC; finestre di registri; allocazione dei registri con colorazione di un grafo; confronto e situazione attuale (MIPS, ARM, x86).Architetture RISC e CISC → nata negli anni '80 e oggi la più diffusa al mondo (smartphone, microcontrollori, molti portatili e server). L'azienda progetta l'ISA e i core e ne vende la licenza. Qui si usa la versione a 32 bit (ARMv7, insieme di istruzioni A32), con un cenno a quella a 64 bit.
Registri
16 registri da 32 bit visibili, r0–r15:
| Registro | Nome | Uso |
|---|---|---|
r0–r3 |
argomenti e valore di ritorno delle funzioni, temporanei | |
r4–r11 |
variabili; vanno preservati dalle funzioni chiamate | |
r12 |
IP | temporaneo |
r13 |
SP | stack pointer |
r14 |
LR | link register: indirizzo di ritorno dopo BL |
r15 |
PC | program counter |
Le convenzioni d'uso di r0–r12 sono fissate dalla convenzione di chiamata (AAPCS, vedi Stack e chiamata di funzioni in ARMChiamata con BL e ritorno con BX LR; convenzione di chiamata AAPCS (argomenti in r0-r3, risultato in r0, registri da preservare r4-r11); stack discendente pieno con PUSH e POP; record di attivazione; funzioni foglia e non foglia; esempio ricorsivo del fattoriale con evoluzione dello stack.Stack e chiamata di funzioni in ARM →). Leggere r15 dà l'indirizzo dell'istruzione corrente + 8 (effetto della pipeline originale a 3 stadi).
CPSR (Current Program Status Register): flag N, Z, C, V nei bit 31–28 (vedi Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →), bit di disabilitazione delle interruzioni, bit del modo corrente.
Modi: User (non privilegiato) e modi privilegiati (Supervisor, IRQ, FIQ, Abort, Undefined, System). Entrando in un modo di eccezione alcuni registri (almeno SP e LR) vengono sostituiti da copie private (banked) e il CPSR viene salvato nello SPSR del modo (vedi InterruptClassi di interruzioni; I/O guidato da interrupt; sequenza hardware e software di gestione con salvataggio del contesto sullo stack; identificazione della sorgente (linee multiple, polling, daisy chain, vettore); priorità e interruzioni annidate; eccezioni e modi in ARM.Interrupt →).
Memoria
- Indirizzi di 32 bit al byte: byte = 4 GB indirizzabili.
- Parole di 4 byte, di norma allineate a indirizzi multipli di 4.
- Di solito little endian (vedi Codifiche binarie e informazione non numericaBit, byte e multipli (potenze di 2 e di 10); codici BCD e Gray; caratteri ASCII, Unicode e UTF-8; ordine dei byte (little e big endian); bit di parità e codice di Hamming per rilevare e correggere errori.Codifiche binarie e informazione non numerica →).
- Architettura load/store: solo
LDR/STRe varianti accedono alla memoria (vedi Istruzioni ARM di accesso alla memoriaLDR e STR per parole, byte e mezze parole con e senza segno; modalità di indirizzamento con offset immediato o registro scalato, pre-indicizzata con write-back e post-indicizzata, con esempi di indirizzo effettivo; caricamento di indirizzi e costanti; LDM e STM.Istruzioni ARM di accesso alla memoria →).
Caratteristiche dell'insieme di istruzioni
- Istruzioni di 32 bit, a 3 operandi:
ADD r0, r1, r2. - Esecuzione condizionata: quasi ogni istruzione può avere un suffisso di condizione e viene eseguita solo se i flag la soddisfano:
ADDEQ r0, r0, #1somma solo se Z = 1. Evita molti salti brevi. - I flag si aggiornano solo se richiesto: suffisso S (
ADDS,SUBS) o istruzioni di confronto (CMP,TST). - Secondo operando flessibile: costante immediata o registro eventualmente scalato da uno shift, nella stessa istruzione:
ADD r0, r1, r2, LSL #2calcola (vedi Istruzioni ARM di elaborazione datiIstruzioni aritmetiche (ADD, SUB, RSB, ADC), logiche (AND, ORR, EOR, BIC, MVN), di spostamento (MOV), moltiplicazione (MUL, MLA); secondo operando immediato o registro scalato con LSL, LSR, ASR, ROR; aggiornamento dei flag con S, CMP e TST; esempi di traduzione di espressioni C.Istruzioni ARM di elaborazione dati →). - Load/store con modalità di indirizzamento base + offset, pre- e post-indicizzate, e trasferimenti multipli (
LDM/STM,PUSH/POP). - Thumb: formato alternativo a 16 bit per un sottoinsieme delle istruzioni, codice circa il 30% più compatto; Thumb-2 mescola istruzioni a 16 e 32 bit.
Sintassi dell'assembler (GNU)
.data
x: .word 5 @ una parola inizializzata a 5
.text
.global main
main: LDR r1, =x @ r1 = indirizzo di x
LDR r0, [r1] @ r0 = x
ADD r0, r0, #1 @ r0 = x + 1
STR r0, [r1] @ x = x + 1
BX lr @ ritorno a chi ha chiamato mainEtichette seguite da :, commenti con @ (o //), costanti immediate con #, direttive con il punto (.data, .text, .word, .byte, .asciz, .space).
ARMv8 a 64 bit (AArch64)
31 registri generali da 64 bit (x0–x30, con le metà basse w0–w30), registro zero xzr, SP e PC non sono registri generali, istruzioni sempre di 32 bit, niente esecuzione condizionata generalizzata (restano CSEL e i salti condizionati). I concetti di questo capitolo restano validi.
Errori tipici
- Usare
r13–r15come registri qualsiasi: hanno ruoli fissi. - Aspettarsi che
ADDaggiorni i flag: serveADDS.
Versione ripasso
Architettura RISCMotivazioni del CISC (divario semantico) e dati sull'esecuzione dei programmi; caratteristiche delle architetture RISC; finestre di registri; allocazione dei registri con colorazione di un grafo; confronto e situazione attuale (MIPS, ARM, x86).Architetture RISC e CISC → a 32 bit (ARMv7, A32).
Registri e memoria
- 16 registri:
r0-r3argomenti e ritorno;r4-r11variabili (preservati);r12IP;r13SP;r14LR;r15PC (letto vale istruzione ). AAPCS: Stack e chiamata di funzioni in ARMChiamata con BL e ritorno con BX LR; convenzione di chiamata AAPCS (argomenti in r0-r3, risultato in r0, registri da preservare r4-r11); stack discendente pieno con PUSH e POP; record di attivazione; funzioni foglia e non foglia; esempio ricorsivo del fattoriale con evoluzione dello stack.Stack e chiamata di funzioni in ARM →. - CPSR: flag N, Z, C, V (bit 31-28, Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →), interruzioni, modo. Modi User e privilegiati (Supervisor, IRQ, FIQ, Abort, Undefined, System); SP e LR banked e CPSR nello SPSR (InterruptClassi di interruzioni; I/O guidato da interrupt; sequenza hardware e software di gestione con salvataggio del contesto sullo stack; identificazione della sorgente (linee multiple, polling, daisy chain, vettore); priorità e interruzioni annidate; eccezioni e modi in ARM.Interrupt →).
- Indirizzi di 32 bit al byte (4 GB); parole di 4 byte allineate; little endian (Codifiche binarie e informazione non numericaBit, byte e multipli (potenze di 2 e di 10); codici BCD e Gray; caratteri ASCII, Unicode e UTF-8; ordine dei byte (little e big endian); bit di parità e codice di Hamming per rilevare e correggere errori.Codifiche binarie e informazione non numerica →); load/store (Istruzioni ARM di accesso alla memoriaLDR e STR per parole, byte e mezze parole con e senza segno; modalità di indirizzamento con offset immediato o registro scalato, pre-indicizzata con write-back e post-indicizzata, con esempi di indirizzo effettivo; caricamento di indirizzi e costanti; LDM e STM.Istruzioni ARM di accesso alla memoria →).
Istruzioni
32 bit, 3 operandi. Esecuzione condizionata (ADDEQ r0,r0,#1) contro i salti brevi; flag solo con S o CMP, TST; secondo operando flessibile (ADD r0,r1,r2,LSL #2 , Istruzioni ARM di elaborazione datiIstruzioni aritmetiche (ADD, SUB, RSB, ADC), logiche (AND, ORR, EOR, BIC, MVN), di spostamento (MOV), moltiplicazione (MUL, MLA); secondo operando immediato o registro scalato con LSL, LSR, ASR, ROR; aggiornamento dei flag con S, CMP e TST; esempi di traduzione di espressioni C.Istruzioni ARM di elaborazione dati →); LDM/STM, PUSH/POP; Thumb a 16 bit (circa 30% più compatto).
Assembler GNU
.data, x: .word 5, .text, .global main; main: LDR r1,=x; LDR r0,[r1]; ADD r0,r0,#1; STR r0,[r1]; BX lr. Etichette :, commenti @, immediati #. AArch64: 31 registri da 64 bit (x0-x30), istruzioni da 32 bit.
Errori tipici: r13-r15 hanno ruoli fissi; ADD non aggiorna i flag, serve ADDS.