L’ASSEMBLER non ha le caratteristiche dei linguaggi ad alto livello, come:
- orientamento verso la soluzione dei problemi (strutture dati e istruzioni specialistiche);
- indipendenza dall’architettura.
Un’istruzione in linguaggio Assembler (
statement) e’ divisa in quattro campi. Più che un’istruzione e’ una riga di programma:
NOME - -
CODICE OPERAZIONE - -
OPERANDI - -
COMMENTO
Commento: i commenti iniziano con il carattere #. I commenti sono una buona abitudine, in quanto rendono rileggibile il programma, anche da altri utenti.
Nome: si tratta essenzialmente di etichette (che iniziano dalla prima colonna e devono terminare con ` : `. Si tratta di un nome usato per indicare un indirizzo di locazione di memoria.
Codice operazione: mnemonico per un’istruzione macchina, oppure può essere mnemonico per una direttiva.
Operandi: operandi immediati o indirizzamento previsto dall’architettura, consistente con il codice operativo.
Ci sono poi delle
PAROLE RISERVATE:
- mnemoniche per indicare codici operativi
- mnemoniche per i nomi dei registri
- mnemoniche per le direttive
DIRETTIVE
Danno ordine all’assemblatore sul modo di tradurre il programma e non generano istruzioni macchina. Si tratta di :
- segnalazione di situazioni anomale
- lettura di moduli ausiliari
- assemblaggio condizionato
- pseudoistruzioni: non corrispondono a istruzioni del linguaggio macchina; esse vengono “tradotte” in un insieme di istruzioni in linguaggio macchina.
- convenzione nell’uso dei registri
ESEMPI di direttive per MIPS
- .align n (allineamento mod 2n)
- .byte b1............bn
- .half h1............hn
- .word w1............wn
- .double d1............dn
- .globl symbol (simbolo globale: visibile da tutti i moduli)
- syscall (chiamata a sistema operativo)
Metodi per la velocizzazione delle prestazioni della macchina:
CANALIZZAZIONE O PIPELINE
L’idea del pipeline e’ scomporre un’istruzione in modo che ogni singola parte sia eseguita in parallelo da moduli differenti, perciò abbiamo differenti fasi:
- suddivisione dell’istruzione in parti
- avanzamento dell’istruzione di un passo all’interno della “pipe”(canale) corrispondente ad un impulso di clock
- la durata del ciclo di clock e’ determinata dal tempo richiesto dallo stadio più lungo
Se gli stati sono bilanciati:
Il tempo fra le istruzioni (
con pipeline)= tempo fra le istruzioni (
senza pipeline)/numero stadi di pipeline
Il pipeline migliora le prestazioni aumentando la frequenza di operazione delle istruzioni, ma peggiorando il tempo di esecuzione della singola istruzione.
Fasi che un’istruzione attraversa per essere eseguita:
CARICAMENTO |
DECODIFICA |
ESECUZIONE |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
C |
D |
E |
|
C |
D |
E |
|
|
C |
D |
E |
|
|
|
C |
D |
E |
Senza pipeline:
3 ISTRUZIONI
Totale Dt: 9
Con pipeline:
3 ISTRUZIONI
Totale Dt: 5
In generale:
per n istruzioni -> (n + 2)Dt
ASPETTI CHE ROVINANO UNA BUONA ORGANIZZAZIONE DELLA PIPELINE
- un’istruzione di salto condizionato perché rende sconosciuta la prossima istruzione da prelevare, fino alla completa esecuzione dell’istruzione di salto
- bilanciamento delle varie fasi a livello di tempo
Il pipeline e’ un’operazione tipica delle architetture RISC, poiché in questo tipo di architetture le istruzioni hanno la stessa lunghezza, perciò la suddivisione in fasi e’ molto più efficiente.
Vediamo ora una migliore suddivisione in fasi:
- PI – prelievo dell’istruzione (caricare un registro opportuno)
- DI – decodifica dell’istruzione (determinazione del codice operativo e identificazione degli operandi)
- CO – calcolo operandi (calcolo dell’indirizzo effettivo di ogni operando)
- PO – prelievo operandi (caricare gli operandi dalla memoria, se serve)
- EI – esecuzione istruzione
- SO – scrittura operando (pone il risultato in memoria)
Questa suddivisione crea delle fasi che hanno più o meno la stessa durata (non tutte le fasi sono però sempre necessarie).
Vediamo come viene modificata la pipeline con questa nuova suddivisione:
1 |
PI |
DI |
CO |
PO |
EI |
SO |
2 |
|
PI |
DI |
CO |
PO |
EI |
SO |
3 |
|
|
PI |
DI |
CO |
PO |
EI |
4 |
|
|
|
PI |
DI |
CO |
PO |
5 |
|
|
|
|
PI |
DI |
CO |
6 |
|
|
|
|
|
PI |
DI |
7 |
|
|
|
|
|
|
PI |
8 |
|
|
|
|
|
|
|
PI |
DI |
CO |
PO |
EI |
SO |
|
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
Dt |
La terza istruzione è di salto e viene ad essere eseguita all'ottavo Dt, bloccando tutte le istruzioni tra la terza e l'ottava, ovvero l'istruzione a cui si riferiva il salto. Le istruzioni bloccate non restituiscono la scrittura dell'operando, che avviene unicamente all'ultimo Dt.
--
AlessandroLonghi - 27 Apr 2002
--
AlessioFrabotta - 27 Apr 2002
--
AnnaMorelli - 27 Apr 2002