
Ancora oggi si usa riferirsi al livello ISA come “architettura” di una macchina o altre volte ( in modo improprio ) coma al “linguaggio assemblativo”.
Il livello ISA costituisce l'interfaccia tra il software e l'hardware.

Il livello ISA deve essere retrocompatibile o costante di modello in modello, in modo che la nuova macchina riesca ad eseguire i vecchi programmi senza modifiche.
Proprietà del livello ISA
Il livello ISA è l’aspetto che la macchina assume agli occhi di un programmatore in linguaggio macchina. Ma siccome nessuno programma più in linguaggio macchina sarebbe meglio dire che : il livello ISA è l'output di un compilatore. Quindi per progettare il codice del livello ISA il progettista del compilatore deve seguire le “regole del gioco” del livello ISA ( rispettivo ) ovvero :
- modello di memoria
- insieme dei registri
- tipi di dati
- istruzioni disponibili L'insieme di tutte queste informazioni definisce il livello ISA.
Per alcune architetture ( non sempre ), li livello ISA è descritto attraverso un documento formale di definizione del produttore del livello ISA, in questo modo i diversi produttori in grado di costruire macchine, sono capaci di eseguire lo stesso codice e che dia gli stessi risultati ( da produttori diversi ma ISA identico ). Il documento specifica le “regole del gioco” del livello ISA ma non la microarchitettura.
In molte macchine ci sono due modalità del livello ISA :
- kernel : eseguire il OS e tutte le istruzioni
- utente : eseguire programmi applicativi e non consentono l’esecuzione di istruzioni “delicate” ( es. manipolare la cache direttamente ) ( ci focalizzeremo ora sulle istruzioni di questa modalità )
Modelli di memoria
In tutti i computer la memoria viene suddivisa in celle adiacenti di un byte ( 8 bit ), che sono a loro volta raggruppati in word da 4-byte ( 32 bit ) o 8 byte ( 64 bit ).
Si utilizza 8 byte perché viene comodo per i caratteri ASCII che sono da 7 bit. Inoltre Unicode e UTF-8 utilizzano multipli di 8-bit per rappresentare i caratteri.
Una cosa fondamentale è l’allineamento utilizzato, infatti una word da 4-byte può iniziare dall’indirizzo 0, 4, 8 etc … ma non da 1 o 2. Stessa cosa per una word da 8-byte che inizierà da 0, 8, 16 etc … ma non da 4 o 6 ( come mostrato in figura qua sotto ).

In questo modo la memoria funziona in modo più efficiente.
I processori a livello ISA hanno un singolo spazio lineare degli indirizzi che si estende dall’indirizzo 0 fino ad un massimo di oppure . Inoltre alcune macchine hanno 2 spazi degli indirizzi separati :
- uno per istruzioni ( codice programma )
- uno per i dati In questo modo si hanno i seguenti vantaggi :
- è possibile avere byte di programma e un aggiuntivo byte di dati, usando solo indirizzi a 32-bit
- siccome le scritture avvengono sempre nello spazio dati, diventa impossibile sovrascrivere il programma ( difficili gli attacchi dei malware siccome non può cambiare il programma )
Registri
Tutti i computer hanno qualche registro visibile a livello ISA, infatti il loro compito è il controllo dell'esecuzione del programma, la memorizzazione dei risultati temporanei e altro. Alcuni registri del livello di microarchitettura, come il TOS e il MAR, non sono visibili a livello ISA, altri invece sono visibili ad entrambi come il SP e PC.
I registri al livello ISA sono sempre visibili al livello di microarchitettura ( sono implementati infatti proprio li ) e sono divisi in 2 categorie di registri :
- specializzati : Program Counter, Stack Pointer e quelli visibili in modalità kernel ( controllo di : cache, memoria, dev I/O e altre funzionalità hardware ) ( impiegati solo dal OS )
- uso generale : variabili locali e risultati temporanei di un calcolo ( accessi veloci a dati usati spesso )
Il registro di flag ( o PSW - Program Status Word ) è un registro ibrido tra modalità kernel e utente, che contiene vari bit di natura diversa, necessari alla CPU, tra cui i codici di controllo, impostati ad ogni ciclo della ALU e riflettono lo stato del risultato dell’operazione più recente :
N: asserito quando dopo risultato negativoZ: asserito dopo risultato uguale a zeroV: asserito quando il risultato causa un overflowC: asserito quando il risultato causa un riporto sul bit più significativoA: asserito quando c’è un riporto oltre il terzo bit ( riporto ausiliario )P: asserito dopo un risultato pari
Questi codici di controllo sono importanti perché vengono utilizzati dalle istruzioni di confronto o di salto condizionato, per esempio :
- istruzione
CMPfa la sottrazione tra due operandi e imposta il codice di condizioneZin base al risultato - successiva istruzione
BEQ( salta se sono uguali ) controlla il bitZe se è asserito allora effettua il salto
Istruzioni
La caratteristica principale del livello ISA è l’insieme di istruzioni che definisce, che specificano cosa la macchina è in grado di fare. Ne abbiamo già viste alcune in Esempio di ISA - IJVM e dopo ne vedremo molte altre.
Overview del livello ISA del Core i7
Il Core i7 è frutto di molte generazioni, il suo ISA oltre ad essere compatibile per programmi scritti per l’8086 e per l’8088, contiene rimembranze del 4004 ( quando c’erano i dinosauri! ).
Poi l’80386 ( o x386 ) ( la “x” sta per la serie 80… ) fu la prima macchina a 32-bit della famiglia Intel da cui nasce una nuova architettura : IA-32 ( Intel Architecture-32 bit ), su cui si fondano anche tutti gli attuali processori Intel come : x486, Pentium, Celeron, Xeon, Centrino, Core duo e Core i7.
I cambiamenti introdotti dal x386 ( introdotti da Intel ma poi implementate da AMD ) sono :
- istruzioni
MMX,SSE,SSE2: specializzate per applicazioni multimediali - x86-64 : estensione dei registri da 32 bit a 64 bit
Il Core i7 ha 3 modalità operative :
- modalità reale : si comporta come un 8088, se vengono eseguire istruzioni sbagliate la macchina si blocca
- modalità virtuale : permette di eseguire vecchi programmi dell’8088 in modo protetto, ovvero che la macchina è controllata da un OS
- modalità protetta : si comporta come un Core i7 con 4 livelli di privilegi controllati dai bit
PSW:- livello 0 : corrisponde alla modalità kernel, usato dal OS ( accesso completo alla macchina )
- livello 1 e 2 : usati raramente
- livello 3 : usato dai programmi utente in modo protetto ( blocca l’acceso ad alcune istruzioni critiche )
Nell’architettura x86 (modello teorico), l’ISA supporta la segmentazione: esistono più segmenti, ciascuno definito da una base e da un limite, con dimensione massima fino a byte (4 GB) in modalità a 32 bit. Nei Core i7 e nei sistemi operativi moderni, la segmentazione è configurata in modalità flat, per cui dal punto di vista del software viene utilizzato un unico grande segmento che copre l’intero spazio di indirizzi lineare. Quindi gli attuali OS ( come UNIX e Windows ) supporta solo un segmento,==in modo che un’applicazione vede un solo spazio degli indirizzi lineare da byte==, inoltre la maggior parte di questo spazio è occupata dal OS. Ogni byte in questo spazio indirizzi ha il suo indirizzo e le word sono da 32-bit ( 4 byte ) memorizzate in formato little-endian ( il byte meno significativo ha l’indirizzo più basso )
Il core i7 ha 4 registri di uso generale a 32-bit :
EAX: operazioni aritmeticheEBX: contenere puntatori o indirizzi di memoriaECX: contatore nei cicliEDX: utilizzato nelle moltiplicazioni/divisioni durante le quali, insieme aEAX, contiene prodotti e dividendi da 64-bit
Tutti questi registri possono essere utilizzati come registri da 16-bit o da 8-bit, siccome i registri a 32-bit furono introdotti dal x386 e quindi furono estesi, infatti la E sta per Extended :

Ci sono altri registri a 32-bit di uso generale :
ESI: contiene il puntatore in memoria alla stringa sorgente ( manipolazione stringhe )EDI: contiene il puntatore in memoria alla stringa destinazione ( manipolazione stringhe )EBP: puntatore per referenziare l’indirizzo base del record d’attivazione corrente ( comeLVperIJVM) ( chiamato anche frame pointer )ESP: puntatore allo stack ( comeSPperIJVM)

Abbiamo inoltre i registri segmento da 16-bit che derivano dalla compatibilità dell’indirizzamento a 16-bit dell’8088 ( “ignorati” quando il Core i7 è impostato per usare un solo spazio di indirizzi lineare - non vengono usati per la traduzione degli indirizzi ) :
CSSSDSESFSGS
E poi abbiamo :
EIP( Extended Instruction Pointer ) che sarebbe il Program CounterEFLAGSanalogo aPSW
