Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Abbiamo visto la suddivisione a livelli di un elaboratore. Abbiamo visto come i livelli interagiscono
tra di loro. Esaminiamo un po’ meglio il livello assembler. Abbiamo detto che il linguaggio che
consente di gestire le risorse a questo livello è il linguaggio macchina o assembly. Il linguaggio
macchina è interpretabile direttamente dal firmware del calcolatore. Il Firmware è la parte
progettata per ottenere un corretto funzionamento degli scopi che ci eravamo proposti (reti
logiche opportunamente connesse!).
Di conseguenza il linguaggio macchina è il linguaggio che il programmatore o progettista di un
compilatore devono impiegare per controllare le risorse di un calcolatore.
La trasformazione avviene tipicamente per passi:
1. nel primo passo i programmi sorgente sono trasformati in programmi assembler, un linguaggio
intermedio dove le istruzioni di macchina sono associate a nomi simbolici più facili da capire e
manipolare per i programmatori;
2. nel secondo passo il programma assembler è tradotto, da un programma detto assemblatore,
nel linguaggio macchina vero e proprio (ovvero in sequenze binarie direttamente interpretabili
dal calcolatore);
3. nel terzo, ed ultimo passo, il programma eseguibile viene caricato in memoria da un
programma detto caricatore (loader) e quindi eseguito.
Tutti i passi per tradurre un programma ad alto livello in linguaggio macchina sono mostrati nella
seguente figura:
La scelta delle istruzioni eseguibili direttamente dal calcolatore (set istruzioni), ha conseguenze
immediate sulla progettazione dell’architettura, sul suo costo e sulle prestazioni che questa può
garantire. Il set di istruzioni di un calcolatore può essere classificato usando diversi criteri, tuttavia,
la classificazione più diffusa è quella basata sulle modalità di memorizzazione ed accesso agli
operandi da parte della CPU. In base a questo criterio possiamo distinguere almeno tre categorie:
1. Architetture a Pila (Stack)
2. Architetture ad Accumulatore
3. Architetture a Registri Generali
Architettura a pila
Le architetture di questo tipo assumono implicitamente che gli operandi si trovino in memoria e in
particolare nella testa di un’area speciale detta pila di sistema. Le istruzioni di calcolo devono
perciò essere precedute e seguite da spostamenti espliciti degli operandi mediante operazioni di
PUSH (inserimento sulla pila) e POP (estrazione di un risultato dalla pila).
Architettura ad accumulatore
Nelle architetture ad accumulatore si assume implicitamente che uno degli operandi sia contenuto
in un registro speciale detto accumulatore. Gli altri operandi vengono prelevati dalla memoria.
Si osservi che nel caso delle architetture Registro-Registro i modi di indirizzamento che specificano
indirizzi di memoria sono rilevanti solo per istruzioni di Load e Store.
Per le istruzioni che trasferiscono il controllo di programma (come le istruzioni di salto o di
chiamata di procedura) esiste un’ulteriore modalità di indirizzamento che è la così detta modalità
relativa al registro di Istruzioni (IC = Instruction Counter a volte PC= Program Counter).
Questa modalità consiste nel fornire un displacement da sommare al valore attuale del registro
istruzioni invece di specificare l’indirizzo assoluto.
Questa modalità garantisce due interessanti proprietà:
Riduce il numero di bits necessari per specificare l’indirizzo di destinazione;
Consente di scrivere programmi che possono essere eseguiti in diverse posizioni della
memoria senza dover essere modificati.