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 negativo
  • Z : asserito dopo risultato uguale a zero
  • V : asserito quando il risultato causa un overflow
  • C : asserito quando il risultato causa un riporto sul bit più significativo
  • A : 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 :

  1. istruzione CMP fa la sottrazione tra due operandi e imposta il codice di condizione Z in base al risultato
  2. successiva istruzione BEQ ( salta se sono uguali ) controlla il bit Z e 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 aritmetiche
  • EBX : contenere puntatori o indirizzi di memoria
  • ECX : contatore nei cicli
  • EDX : 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 ( come LV per IJVM ) ( chiamato anche frame pointer )
  • ESP : puntatore allo stack ( come SP per IJVM )

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 ) :

  • CS
  • SS
  • DS
  • ES
  • FS
  • GS

E poi abbiamo :

  • EIP ( Extended Instruction Pointer ) che sarebbe il Program Counter
  • EFLAGS analogo a PSW

Tipi di dati