Spesso i termini ISA e ABI vengono confusi, ma capire la distinzione è vitale per chi scrive codice che deve interagire direttamente con l’hardware (come un RTOS o driver bare-metal).
Ecco la differenza tecnica e una guida su quale “manuale ISA o ABI” consultare in base a cosa stai sviluppando.
1. Differenza Fondamentale: Il “Cosa” vs Il “Come”
Per semplificare con un’analogia linguistica:
- ISA è il Vocabolario e la Grammatica. Definisce le parole che la CPU capisce (istruzioni) e le regole fisse dell’hardware. È immutabile per quel chip.
- ABI è il Galateo e il Protocollo. Definisce le regole di comportamento sociale tra pezzi di codice diversi (funzioni, librerie, OS). È una convenzione software: lo stesso chip può supportare ABI diverse.
ISA: Instruction Set Architecture (Il Contratto Hardware)
L’ISA è il confine fisico tra software e hardware. Definisce tutto ciò che è visibile al programmatore assembly.
- Cosa definisce:
- Istruzioni:
ADD,SUB,LOAD,STORE. - Registri: Quanti sono, quanto sono grandi (es. 32 registri a 32-bit su MIPS/RISC-V, 16 su ARM).
- Tipi di Dati: Come sono rappresentati interi, float, byte in memoria.
- Modelli di Memoria: Come la CPU accede agli indirizzi (allineamento, endianness).
- Istruzioni:
- Quando ti serve il manuale ISA:
- Quando scrivi codice Assembly (es. context switch, startup code).
- Quando fai debugging di un crash (Hard Fault) e devi leggere il disassemblato.
- Quando devi capire perché un’operazione atomica non funziona.
ABI: Application Binary Interface (Il Contratto Software)
L’ABI è un insieme di regole concordate (solitamente dal compilatore e dal sistema operativo) su come usare l’ISA per far collaborare le funzioni. Senza ABI, una funzione main() non saprebbe come passare i dati a una funzione printf().
- Cosa definisce:
- Calling Convention: Quali registri usiamo per passare i parametri? (es. ARM usa R0-R3, MIPS usa a0-a3). Chi deve salvare i registri? (Caller-saved vs Callee-saved).
- Layout della Memoria: Come sono allineate le
structin C? Quanto è grande unenum? - System Calls: Come un programma chiede servizi al Kernel (es. registro R7 su ARM Linux, registro $v0 su MIPS).
- Quando ti serve il manuale ABI:
- Quando scrivi codice misto C e Assembly (devi sapere dove leggere i parametri passati dal C).
- Quando scrivi un Linker Script o gestisci lo stack manualmente.
- Quando il tuo firmware crasha inspiegabilmente al ritorno da una funzione (spesso violazione dell’ABI sullo stack).
2. Esempio Pratico Comparativo
Immagina di voler chiamare una funzione sum(int a, int b) che somma due numeri.
Prospettiva ISA (Cosa fa la CPU) :
- ARM: La CPU sa solo che deve prendere due registri ed eseguire l’istruzione
ADD. Non le importa quali registri siano usati per gli argomenti. - MIPS: Idem, esegue
ADD $d, $s, $t.
Prospettiva ABI (Come si accordano le funzioni): L’ABI dice: “Per chiamare sum, devi mettere a nel primo registro argomenti e b nel secondo”.
| Caratteristica | ARM Cortex-M (ABI AAPCS) | MIPS32 (ABI O32) |
|---|---|---|
| Passaggio Parametri | Metti a in R0, b in R1. | Metti a in $a0 (4), b in a1 ($5). |
| Valore di Ritorno | Leggi il risultato in R0. | Leggi il risultato in $v0 ($2). |
| Return Address | Salva l’indirizzo di ritorno in LR (R14). | Salva l’indirizzo di ritorno in $ra ($31). |
| Allineamento Stack | Lo stack deve essere allineato a 8 byte. | Lo stack deve essere allineato a 8 byte. |
3. Quale Manuale Seguire per lo Sviluppo?
la consulta del manuale ISA / ABI per lo sviluppo FW , dipende dal livello a cui stai operando.
A. Se sviluppi logica applicativa in C/C++ (Alto Livello)
Non ti servono né ISA né ABI direttamente. Il compilatore (GCC/Clang) si occupa di rispettare l’ISA e l’ABI.
- Il tuo manuale: Datasheet del Microcontrollore (Memory Map, Periferiche) e Documentazione delle Librerie (HAL, RTOS API).
- Focus: Registri delle periferiche (GPIO, UART), API del sistema operativo.
B. Se scrivi Driver, codice di Startup o RTOS Porting (Basso Livello)
Ti servono entrambi.
- ABI Manual (es. “ARM AAPCS” o “System V ABI MIPS”):
- Cruciale per: Scrivere funzioni in Assembly chiamabili dal C. Se sbagli a salvare un registro “Callee-saved” (come R4-R11 su ARM), la funzione C chiamante si ritroverà variabili corrotte al ritorno, causando bug impossibili da trovare.
- ISA Manual (es. “ARMv7-M Architecture Reference Manual”):
- Cruciale per: Usare istruzioni speciali non mappate direttamente in C (es.
WFIper risparmio energetico,LDREX/STREXper semafori, gestione dei registri di controlloCONTROLoCP0).
- Cruciale per: Usare istruzioni speciali non mappate direttamente in C (es.