Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1) - Richiami Fondamentali e Metodologie
I SISTEMI DI ELABORAZIONE sono dei sistemi molto complessi: a seconda di come viene tracciata la
frontiera tra il sistema e il mondo esterno, possiamo individuare dei sottoinsiemi funzionali di diversa natura.
L'identificazione formale dei sottoinsiemi ci porta ad affrontare lo studio di un sistema di elaborazione secondo determinati livelli gerarchici di interpretazione.
L'uso di livelli gerarchici, ci permette, oltre alla facile individuazione delle relazioni che intercorrono tra di
essi, di poter GENERALIZZARE e ASTRARRE il funzionamento a quel livello specifico, senza curarci di
come siano costituiti i livelli inferiori.
Ad esempio, analizzando un sistema dal punto di vista del programmatore, che utilizza un determinato linguaggio, si possono scrivere dei programmi indipendentemente dalla particolare macchina utilizzata.
In generale, una strutturazione a livelli, o MACCHINE VIRTUALI può essere vista nel seguente schema:
Ogni livello MVi è caratterizzato da:
Ri = Insieme di risorse o oggetti visibili a chi programma quel livello.
Li = Linguaggio disponibile per il controllo e la gestione degli elementi dell'insieme Ri.
Dovendo riferirci ad una macchina reale, chiameremo il livello MV0 quello tipico dei componenti fisici
(componenti elettronici).
Il livello MV0 è quindi chiamato livello di macchina reale, ovvero di macchina hardware; a questo livello,
non ha senso definire un linguaggio, in quanto le funzionalità sono insite nella struttura hardware e non
emulabili ulteriormente.
I livelli superiori, sono raggiungibili mediante dei processi successivi di astrazione; un generico livello MVi,
è caratterizzato, in pratica, dal particolare linguaggio adottato, in quanto si dovranno , per questo, definirne
obbligatoriamente le risorse.
Le relazioni tra i vari livelli, sono di tipo GERARCHICO: i componenti di ogni livello appaiono essere come PRIMITIVI a quel livello, ma strutturati nei livelli sottostanti.
Ogni Istruzione Primitiva o Meccanismo del linguaggio generalizzato Li è implementata da un PROGRAMMA o POLITICA scritto nel linguaggio Lj con, evidentemente:
0 <j<i
normalmente sarà j=i-1 ma, per ragioni di efficienza, può essere anche minore, ovvero la particolare politica
può far uso di primitive appartenenti ad uno qualsiasi dei livelli sottostanti.
Se ne deduce, che, individuando meccanismi distinti di Li, questi possono essere implementati utilizzando
linguaggi appartenenti anche a dei livelli differenti.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 1
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.1) Introduzione sulla COMPILAZIONE e INTERPRETAZIONE
Per Compilazione PURA, si intende l' operazione attraverso la quale si sostituisce al programma originario
(programma sorgente) un programma funzionalmente equivalente scritto in linguaggio a basso livello
(linguaggio macchina).
L' operazione viene eseguita in maniera statica, ovvero, prima di poter eseguire il programma, è necessario completare correttamente la fase di compilazione:
Programma
Sorgente
COMPILATORE
Programma
Dati
Oggetto
FASE DI COMPILAZIONE
PROGRAMMA
OGGETTO
Risultati
FASE DI ESECUZIONE
Per Interpretazione PURA, si intende quando il programma originario, rimane in macchina, durante l'esecuzione, in forma originale, ed è eseguito tramite un programma (interprete) che effettua un procedimento di
interpretazione di ogni singola istruzione.
Dati
PROGRAMMA SORGENTE
-------------------------------------INTERPRETE
Risultati
INTERPRETAZIONE
Le soluzioni Compilazione/Interpretazione pure, offrono vantaggi e svantaggi contemporaneamente.
Nella compilazione, si ha la difficoltà che bisogna, per effettuare delle modifiche, disporre del programma
originario, per poi compilarlo e quindi lanciarlo in esecuzione; al contrario, l' interprete, permette molta più
flessibiltà in quanto consente di individuare facilmente eventuali errori semantici e di correggerli immediatamente.
Per quanto riguarda la velocità di esecuzione, utilizzando dei compilatori, avremo una efficenza molto
maggiore che nel caso di interpreti, con in più anche la sicurezza che non si verifichino errori sintattici durante l'esecuzione.
Esiste anche la possibilità di adottare una soluzione mista, ovvero di poter definire un linguaggio intermedio, ottimizzato per l'interpretazione da parte di un opportuno programma (run time executor). In questo caso, infatti, si otterranno tutte le garanzie date dalla compilazione, si migliorerà l'efficenza in fase di interpretazione e, sicuramente si ottimizzeranno gli ingombri del programma oggetto, in quanto le primitive ricorrenti saranno contenute nel Run-Time.
La generazione del linguaggio intermedio, permette anche di poter utilizzare linguaggi diversi che utilizzino
un unico run-time, consentendo al programmatore di scrivere programmi per una stessa procedura, utilizzando il linguaggio che più si adatta per ogni situazione.
A questo punto, qualcuno potrebbe chiedersi se esistano dei procedimenti di traduzione (procedimento
statico: ogni componente al livello i, viene SOSTITUITO da un insieme di componenti al livello j) o interpretazione (procedimento dinamico: non avviene la sostituzione , ma possono coesistere elementi appartenenti al livello i ed al livello j) che permettano di definire i meccanismi al livello i tramite politiche al livello j.
Per chiarire meglio questa posizione, cerchiamo di focalizzare opportunamente cos'é un Linguaggio Generalizzato.
Facendo riferimento alle situazioni pratiche, possiamo individuare come Linguaggio Generalizzato, sia
Pacchetti Applicativi, sia i linguaggi di programmazione, sia i Sistemi di comunicazione con altri sistemi e/o
strumenti.
Secondo questa definizione, il senso della relazione gerarchica va individuato essenzialmente al tempo di
esecuzione (RUN-TIME).
Possiamo associare, in definitiva, ad ogni livello virtuale MVi un "supporto a tempo di esecuzione" (runtime-support) di Li, che chiameremo RTS(Li). In definitiva, un RTS(Li) può essere visto come una libreria di
algoritmi e strutture dati, implementati utilizzando l'insieme dei livelli Mvj (0<j<i), atti ad eseguire i meccanismi di Li.
Possiamo a questo punto dare una prima definizione di ARCHITETTURA di SISTEMA, riferendoci alla
frontiera tra il livello considerato ed il mondo esterno (livelli superiori).
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 2
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.2) Livelli tipici di un Sistema di Elaborazione
Per fissare le idee, analizziamo ora in dettaglio quali sono i livelli tipici di un sistema di elaborazione:
----------------------------------------------------------------MV4
APPLICAZIONI
R4= Archivi, Data Base e altri dati strutturati
L4= Cobol/Pascal/Basic/Assmbler
----------------------------------------------------------------MV3
SISTEMA OPERATIVO
R3= Memoria centrale e di massa, file, programmi, processori
L3= Linguaggio di programmazione concorrente/sequenziale con
chiamate a primitive di sistema.
----------------------------------------------------------------MV2
MACCHINA ASSEMBLER (MACCHINA MACCHINA)
(ARCHITETTURA)
R2= Locazioni di memoria, Registri generali e di I/O
L2= Linguaggio Macchina
----------------------------------------------------------------MV1
MACCHINA FIRMWARE
(STRUTTURA)
R1= Registri, moduli funzionali, operatori aritmetico-logici
L1= Linguaggio di microprogrammazione
----------------------------------------------------------------MV0
MACCHINA HARDWARE
R0= Componenti elettronici, collegamenti fisici, ..
L0= Non definito
----------------------------------------------------------------Ulteriori suddivisioni in sottolivelli potrebbero essere fatte per :
MV4:
----------------------------------------------------------------MV4.3
APPLICAZIONI TRANSAZIONALI
----------------------------------------------------------------MV4.2
GESTIONE DI TRANSAZIONI
----------------------------------------------------------------MV4.1
GESTIONE DI DATA BASE
----------------------------------------------------------------MV4.0
LINGUAGGI
----------------------------------------------------------------e per:
MV3:
----------------------------------------------------------------MV3.2
FUNZIONI DI SUPERVISORE
----------------------------------------------------------------MV3.1
GESTIONE ALTRE RISORSE
----------------------------------------------------------------MV3.0
GESTIONE PROCESSI/PROCESSORI
-----------------------------------------------------------------
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 3
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.3) Strutturazione a MODULI (Approccio Orizzontale)
Per ogni livello MVi, sono note le funzionalità espletate in quel livello, se quindi indichiamo con:
Fi = {fi1,fi2,....f ik}
L'insieme delle "FUNZIONI" assegnate (da intendere il termine funzione in senso molto ampio, appunto
come 'funzionalità') a MVi. Da questo insieme, individuiamo dei sottoinsiemi Fijj disgiunti di Fi, che indicheremo con:
n
n
Fi = U Fij
con
j =1
∏F
j =1
ij
=∅
Questa decomposizione dipende dalle prestazioni che si vogliono ottenere a quel livello e sara' tipica della
sua architettura.
Possiamo, a questo punto definire formalmente il SISTEMA DI ELABORAZIONE AL LIVELLO MVi come :
SIi = (MUi , FIi)
con
MUi = { Mi1, Mi2, .... Min} = insieme dei MODULI di ELABORAZIONE ad ognuno dei quali e' affidata l'elaborazione di una Fij.
FIj = STRUTTURA DI INTERAZIONE, mediante la quale i moduli Mij cooperano per l'espletamento di tutte
le funzioni di Mvi.
Mi1
Mi2
STRUTTURA
DI
INTERAZIONE
Mij
Fig. 2
Ogni MODULO di ELABORAZIONE è definito come una entità computazionale AUTONOMA E SEQUENZIALE. La caratteristica di AUTONOMIA, permette la progettazione dei singoli moduli indipendentemente
dagli altri. La caratteristica di SEQUENZIALITA', assicura la presenza di un singolo LUOGO DEL CONTROLLO, ovvero l'attività del modulo, può essere descritta da una lista sequenziale di istruzioni, detta appunto "algoritmo di controllo". Questa sequenzialità, comunque non preclude la possibilità che possano
esserci delle istruzioni eseguibili simultaneamente. In ogni caso, conviene riferirci al parallelismo che si viene a creare tra i vari moduli di elaborazioni, che caratterizza la sua strutturazione.
Esempi tipici dei moduli di elaborazione sono:
LIVELLO MV1 = UNITA' DI ELABORAZIONE
LIVELLO MV3 = PROCESSI
mentre gli algoritmi di controllo saranno:
LIVELLO MV1 = STRUTTURA DELLE MICROISTRUZIONI
LIVELLO MV3 = STRUTTURA DEI COMANDI SECONDO LINGUAGGI DI PROGRAMMAZIONE CONCORRENTE
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 4
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
UNITA' DI ELABORAZIONE
x
P.C.
condizioni
x
comandi
P.O.
Rete
Combinatoria
s
y
y
s’
Buffer
clock
Fig 3a
Fig 3b
Esse sono costituite da due AUTOMI che indicheremo con PC e PO, per distinguere la sezione di controllo
da quella operativa, interconnessi come in Fig. 3a. Ogni funzione affidata all'unità di elaborazione, viene
interpretata da un microprogramma. La PO, esegue le operazioni elementari previste da ogni microistruzione utilizzando, ad esempio:
RETI COMBINATORIE DI CALCOLO
RETI DI INSTRADAMENTO DATI
REGISTRI INTERNI
REGISTRI DI INTERFACCIAMENTO CON L'ESTERNO
L'esecuzione di ogni microistruzione, è controllata dalla PC, la quale invia dei segnali di comando che vanno ad agire sulle risorse di PO. La PC conosce lo stato della PO, tramite il valore dei segnali detti "variabili
di condizionamento".
Sia PC che PO, sono implementati come delle reti sequenziali sincrone di tipo LLC (Fig. 3b), cioè con segnali di ingresso e di uscita a Livelli (L-L) e sincronizzate da un segnale periodico impulsivo detto "clock"
dell'unita (C).
Il funzionamento di una LLC e' il seguente:
ad ogni impulso di clock (generalmente si sceglie il fronte di discesa), il valore delle variabili di stato successivo, viene immagazzinato nelle memorie per costituire il nuovo stato. A questo punto, la parte combinatoria della rete, in base ai valori degli ingressi e dello stato, fornisce (in forma stabile dopo un certo tempo
T) i valori delle uscite, alcune delle quali destinate a formare lo stato successivo. Il cuore del funzionamento
e' il "buffer" che fornisce l'elemento di "STATICIZZAZIONE" e "STABILIZZAZIONE" a tutta la rete. Il periodo degli impulsi di clock è condizionato dal massimo tempo T che occorre alla rete combinatoria, per fornire
valori stabili alle uscite.
Per gli AUTOMI (Macchine sequenziali sincrone) possono essere realizzati secondo due diversi modelli
matematici:
MODELLO DI MEALY:
Y(t) = Fy [ X(t) , S(t) ]
S(t+1)= Fs [ X(t) , S(t) ]
Fy=Funz. di USCITA
Fs=Funz. di STATO
secondo il quale, l'uscita e lo stato successivo dipendono sia dallo stato interno che dai valori degli ingressi.
MODELLO DI MOORE:
Y(t) = Fy [ S(t) ]
S(t+1)= Fs [ X(t) , S(t) ]
Fy=Funz. di USCITA
Fs=Funz. di STATO
secondo il quale, l'uscita dipende solo dal valore dello stato presente, mentre lo stato successivo dipende
sia dallo stato interno che dai valori degli ingressi. In questo caso, notiamo come la variazione degli ingressi
all'inizio del ciclo, influenzerà l'uscita solo al prossimo ciclo del clock.
Per la realizzazione delle unita' di elaborazioni sono possibili le seguenti combinazioni:
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 5
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
PC
Mealy
Moore
Moore
PO
Moore
Moore
Mealy
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 6
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.4) Macchine di VON NEUMANN
Come modello di riferimento per la classificazione delle architetture al livello MV2, possiamo ancora oggi
utilizzare quello tracciato, nel 1946 da John von Neumann:
MEMORIA
PROCESSORE
Il processore estrae le istruzioni dalla memoria, le interpreta e le esegue fino alla risoluzione del problema.
I dati, vengono trasformati dal programma in esecuzione attraverso una successione di stati fino al raggiungimento dello stato finale nel quale i dati sono i risultati ottenuti.
L' elemento base di questo modello è la sua PROCEDURALITÀ ovvero la necessità di dover descrivere il
problema alla macchina secondo una sequenza di operazioni elementari o istruzioni.
Gli elementi costituenti la macchina di VON NEUMANN sono :
1) IL PROCESSORE:
Come detto precedentemente, il processore interpreta le istruzioni formulate seguendo un particolare SET
di ISTRUZIONI (linguaggio al livello MV2) secondo il seguente schema ciclico:
FETCH
DECODE
EXECUTE
N.I.
FETCH
: Estrazione dalla memoria dell' istruzione da eseguire
DECODE : Decodifica o interpretazione
EXECUTE : Esecuzione istruzione: le modalità attraverso le quali viene svolta questa fase, variano da a
secondo del tipo di istruzioni. Al limite questa fase può mancare addirittura (istruzione nulla o
No OPERATION).
N.I.
: Predisposizione per leggere la prossima istruzione: questa fase può essere messa, teoricamente in qualsiasi punto del ciclo.
Da notare che le prime due fasi, devono essere sempre eseguite qualunque sia l'istruzione.
Lo schema precedente, definisce un sistema sequenziale e quindi avremo bisogno di MEMORIA o STATI
INTERNI che ci permettano di tener traccia delle risorse disponibili. Se ne deduce che il processore dovrà
far uso di REGISTRI particolari, i REGISTRI macchina.
2) LA MEMORIA
Possiamo pensare la memoria come costituita da una sequenza di locazioni o contenitori di informazioni
elementari. è possibile estrarre l'informazione elementare fornendo l'indirizzo richiesto.
3) LINGUAGGIO PROCEDURALE o IMPERATIVO
Evidenziamo il Linguaggio L2 in quanto è essenzialmente questo che caratterizza la macchina di VON
NEUMANN, in quanto:
• Stabilisce a priori un ordinamento sequenziale tra le istruzioni di uno stesso programma. Esso è implementato tramite il "program counter" e le istruzioni di "Salto".
• Prevede una organizzazione LINEARE delle locazioni di memoria riferite da INDIRIZZI, con possibilità di
riassegnarne il contenuto.
Le macchine basate sul modello di von NEUMANN possono essere classificate in base al loro:
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 7
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
FLUSSO DI ISTRUZIONI o INSTRUCTION STREAM
É sinonimo di processo, indica la sequenza di istruzioni cosi' come vengono eseguite al livello MV2
FLUSSO DEI DATI o DATA STREAM
Sequenza dei dati cosi' come vengono riferiti da una sequenza di istruzioni.
Mike Flynn stabili' la seguente classificazione:
SISD : Single Instruction, Single Data Stream
Vengono eseguite istruzioni appartenenti ad un singolo processo su un singolo insieme di dati. L' organizzazione è quella della tipica macchina di von Neumann: l'unica forma di parallelismo si può avere ai
livelli inferiori e viene indicata come "PIPELINE" ovvero possibilità di sovrapporre le fasi del ciclo fondamentale del processor. In quest'ultimo caso, si può parlare di UNIPROCESSORE PARALLELO o
CALCOLATORE PIPELINE.
SIMD : Single Instruction, Multiple Data Stream
Vengono eseguite istruzioni appartenenti ad un singolo processo su un insieme multiplo di dati, ovvero
l'istruzione può far riferimento a più di una locazione di memoria. Questo tipo di organizzazione, può essere usata per operazioni su dati vettore-vettore (APL-LIKE). Fanno parte di questa categoria gli "Array
Computers", costituiti da una singola unità di controllo e più unità di calcolo che operanti su locazioni di
memoria diverse. Per schematizzare questa organizzazione, separiamo il processore nelle due parti
UNITÀ DI CONTROLLO e UNITÀ FUNZIONALI o MODULI di ELABORAZIONE:
UNITA’
DI CONTROLLO
(K)
UNITA’
FUNZIONALI
(F)
MEMORIA
DATI
(M)
UNITA’
FUNZIONALI
(F)
MEMORIA
DATI
(M)
MISD : Multiple Instruction, Single Data Stream
Vengono eseguiti più processi che operano su uno stesso insieme di dati. è un tipo di organizzazione
anomalo ma che può essere considerato come caso particolare della successiva:
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 8
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
MIMD : Multiple Instruction, Multiple Data Stream
Ogni processo opera nel proprio ambiente di elaborazione con possibilità di cooperare e condividere le
risorse. In questo caso si parla di "parallelismo completo" e di macchine a "processori multipli". Possiamo distinguere due principali sottoclassificazioni delle macchine MIMD:
MIMD Multiprocessor
K
K
MIMD Multicomputer
link
K,F
M
K,F
M
M
K
K
Nei multiprocessor, si ha la condivisione della memoria primaria nella stessa macchina e quindi anche la
condivisione delle unità di I/O.
Nei multicomputer, le singole macchine, ognuna con proprie unità di I/O, sono collegate tra di loro lascamente (RETI di computer e diversi sistemi operativi) o strettamente (COMMON BUS e stesso sistema operativo)
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 9
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.5) Macchine NON di VON NEUMANN
Le macchine che non rientrano nello schema di Von Neumann utilizzano linguaggi con SEMANTICA DICHIARATIVA al livello MV2. Possiamo distinguere due grandi categorie di linguaggi a semantica dichiarativa:
- LINGUAGGI FUNZIONALI
Sono quei linguaggi dove non esiste un ordinamento sequenziale delle istruzioni stabilito a priori: La computazione equivale ad una composizione di funzioni matematiche. In questi linguaggi, non esiste il concetto
di MEMORIA o di variabile, ma esiste semplicemente un passaggio di valori (il risultato di una funzione).
Le macchine che utilizzano i linguaggi funzionali sono chiamate "MACCHINE DATA FLOW" o "MACCHINE
A RIDUZIONE".
- LINGUAGGI LOGICI
Si costruisce una base di conoscenza parziale, facendo alcune asserzioni su dei fatti e si definiscono delle
RELAZIONI su fatti dichiarati. Il linguaggio, a questo punto, prevede delle richieste per vedere se certe relazioni sono verificate e per quali elementi. (es.: PROLOG, SQL, ..)
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 10
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.6) Rappresentazione dell’INFORMAZIONE
L'informazione è, per sua natura, un'entità astratta ed ha quindi bisogno di essere rappresentata tramite
grandezze fisiche concrete. Una volta trasformata in un mezzo omogeneo, è possibile far operare le diverse
unità che compongono i calcolatori attraverso i dispositivi di memorizzazione e trasmissione che costituiscono la RETE LOGICA DI FLUSSO DEI DATI (data path).
Nei calcolatori digitali, occorre rappresentare le informazioni usando livelli discreti di una grandezza fisica
(tensione, corrente, flusso magnetico, etc.). Ad ogni livello è possibile associare un simbolo ben preciso;
l'insieme costituito da questi simboli costituisce l' ALFABETO tramite il quale le informazioni possono essere espresse.
Per memorizzare l'informazione così trasformata, occorreranno dei dispositivi in grado di assumere le N
configurazioni diverse relative ad ogni simbolo dell'alfabeto. Un tale dispositivo viene chiamato DISPOSITIVO ELEMENTARE a N STATI.
L'alfabeto usato nei calcolatore digitali è costituito da DUE SIMBOLI che chiameremo nel seguito 0 e 1, ai
quali corrisponderanno due livelli discreti della grandezza fisica in grado di rappresentare la configurazione
del dispositivo elementare a 2 stati necessario per la memorizzazione dell' informazione.
La scelta di un alfabeto a due simboli può essere motivata dalle seguenti esigenze:
• EFFICIENZA: Le operazioni matematiche in binario sono molto veloci e questo rende il calcolatore
molto efficiente nelle applicazioni scientifiche.
• SEMPLICITÀ: I circuiti necessari per operare in aritmetica binaria sono notevolmente semplici (es.: fulladder) e ciò comporta un minor costo della macchina che può essere realizzata sfruttando grosse economie di scala. (esistono molti circuiti replicati tutti uguali tra di loro).
• AFFIDABILITÀ: Un calcolatore deve dare risultati esenti da errori ( ovvero con probabilità di errore il più
possibile bassa). Lo scelta dei due livelli permette di aumentare l' affidabilità della macchina in quanto,
utilizzando degli opportuni dispositivi di trigger, questa può essere resa insensibile ad eventuali rumori o
disturbi. Ad esempio, se si associa al livello 0 il valore di tensione -12V e al livello 1 il valore di tensione
+12V, si possono prevedere di approntare degli opportuni trigger in grado di riconoscere:
- livello 0 qualsiasi valore di tensione compreso tra -2 e -22V
- livello 1 qualsiasi valore di tensione compreso tra +2 e +22V
questo significa, che eventuali disturbi di entità compresa tra -10V + 10V sovrapposti al livello nominale,
non alterano l'informazione. La fascia di indecisione compresa tra -2V e +2V, può essere rimossa assumendo come stato valido il valore dell’ultimo livello riconosciuto. Alternativamente, si può adottare la
scelta di segnalare un errore, nel caso ci si trovi ad interpretare un livello di tensione appartenente alla
fascia di indecisione.
- Strutture fisiche GERARCHICHE di INFORMAZIONE
L’informazione elementare, deve essere strutturata fisicamente, in modo da consentire la rappresentazione di ogni informazione in modo opportuno. Per questo, si utilizzano le seguenti strutture fisiche, elencate in ordine gerarchico.
BIT
HALF BYTE o NIBBLE
BYTE
WORD (PAROLA)
Informazione elementare a 2 valori (0/1 , SI/NO)
Gruppo di 4 BIT, serve per individuare un’ informazione a 16 valori
Gruppo di 8 BIT (ottetto), serve per individuare un’informazione a 256
valori
Unità fondamentale di informazione usata per i trasferimenti.
Nella pratica corrente, si possono individuare le seguenti strutture aggiuntive, basate sul numero di valori
possibili immagazzinabili:
WORD
DOUBLE WORD
QUAD WORD
Gruppo di 16 BIT: individua 65.536 possibili valori
Gruppo di 32 BIT: individua 4.294.967.296 possibili valori
Gruppo di 64 BIT: individua 1,844674407371e+19 possibili valori
Nota:
La definizione di WORD, risulta ambigua, in quanto si riferisce a due possibili interpretazioni. Per risolvere quatta ambiguità, useremo per convenzione il termine “PAROLA” per indicare l’unità fondamentale di
informazione ed il termine “WORD” per indicare un gruppo di 16 bit.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 11
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
Dalle strutture fisiche di informazione si nota che le strutture gerarchicamente superiori possono essere
espresse come multipli delle strutture inferiori ovvero:
BIT
NIBBLE
BYTE
WORD
DOUBLE WORD
QUAD WORD
Informazione elementare a 2 valori (0/1 , SI/NO)
Gruppo di 4 BIT
Gruppo di 8 BIT o di 2 NIBBLE
Gruppo di 16 BIT o di 4 NIBBLE o di 2 BYTE
Gruppo di 32 BIT o di 8 NIBBLE o di 4 BYTE o di 2 WORD
Gruppo di 64 BIT o di 16 NIBBLE o di 8 BYTE o di 4 WORD o di 2 DOUBLE WORD
Tra queste strutture, quella più largamente utilizzata attualmente, anche come unità di misura, è senza
dubbio il BYTE: è una prassi comune definire la quantità di memoria disponibile in un computer esprimendola in BYTES, anche se l’unità fondamentale di informazione (PAROLA) dei computer attuali è la DOUBLE
WORD (32 bit).
Il motivo di tale scelta è originato principalmente dal fatto che, come vedremo in seguito, la dimensione
di un byte ci permette di esprimere 256 combinazioni diverse, sufficienti per rappresentare ampiamente un
carattere dell’alfabeto (maiuscoli, minuscoli, segni di interpunzione e simboli speciali) e quindi adatto a
contenere un’informazione alfanumerica. Un’altra ragione è di motivo storico, dettata dall’evoluzione dei
microprocessori da 8 a 16 e quindi a 32 bit: le strutture fisiche si sono evolute tenendo come riferimento il
byte.
Si tratta, a questo punto, di decidere come deve essere rappresentata una struttura gerarchicamente superiore accostando più bytes. Si hanno, in particolare due possibilità:
1. Big Endian: il primo byte di una word (o double word o quad word) indica la cifra più significativa
2. Little Endian: il primo byte di una word (o double word o quad word) indica la cifra meno significativa
La prima è più vicina alla nostra rappresentazione dei numeri: per indicare il numero “centododici” in fatti
noi indichiamo prima le centinaia, poi le decine e quindi le unità. Questo tipo di rappresentazione era quella
utilizzata principalmente nei computer degli anno 60/70: leggendo sequenzialmente la memoria di un computer si intuiva facilmente il valore di un numero composto da più bytes
La seconda, che è stata introdotta la prima volta nei PDP-11, ma è più conosciuta come “Formato INTEL”, è più vicina alle esigenze dei microprocessori ed è autoallineante. Infatti, se si deve effettuare una
somma tra due numeri, costituiti ciascuno da un numero di bytes variabile, occorre effettuare le somme
parziali a partire dalla cifra meno significativa fino alla più significativa: se i numeri sono rappresentati in
Little endian basta partire dal primo byte e proseguire in avanti finché uno dei due non termina. Viceversa,
se i numeri sono rappresentati in Big endian occorre prima allineare a destra i due numeri e quindi eseguire
il calcolo spostandosi all’indietro.
Quindi, nelle due possibilità si hanno dei vantaggi e svantaggi circa equivalenti. A conferma di ciò, basti
considerare, ad esempio, che nei processori INTEL x86, in cui si addotta il Little-endian in memoria, i registri sono in formato Big-endian.
I termini Little endian e Big endian derivano, storicamente dai “I viaggi di Gulliver” di Swift:
A Lilliput si emanò una legge che obbligava i cittadini a rompere le uova dalla parte più piccola (Little
endian); questo scatenò una guerra civile tra quelli che volevano rompere le uova dalla parte più grande
(Big endian). I Big-endian furono quindi costretti a rifugiarsi in un isola vicina, il regno di Blefuscu. (Da notare che Big-endian ha la stessa iniziale di Blefuscu e Little-endian quella di Lilliput)
La satira di Swift, ovviamente si riferiva alla guerra religiosa (assurda) tra l’Inghilterra Protestante e la
Francia Cattolica e metteva in evidenza la futilità del contendere.
Anche nel nostro caso, non è il caso di scatenare una guerra, ma una decisione deve essere pur presa
se si vogliono far comunicare computer diversi tra di loro.
Purtroppo, ancora oggi non si è presa una decisione e nessun “saggio” ha emanato un proclama che obbliga i costruttori ad utilizzare un metodo piuttosto che l’altro con il risultato di avere una “costosa anarchia”:
quando si ha la necessità di collegare due sistemi diversi, occorre informarsi sul tipo di endian
(allineamento) utilizzato da ciascuno e provvedere a scrivere le opportune routine di conversione, inserendo
quindi un overhead (sovralavoro) nel caso che i due sistemi non usino lo stesso allineamento.
Una trattazione più completa dei formati Little-endian e Big-endian si può trovare su
http://www.isi.edu/in-notes/ien/ien-137.txt.3
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 12
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.7) Il sistema di numerazione BINARIO
Il Sistema di numerazione BINARIO, così come quello DECIMALE è di tipo posizionale . La cifra 1, assume il valore di potenze del 2 via via crescenti, man mano che la posizione si sposta verso sinistra, come
succede nel sistema decimale, dove le potenze sono quelle del 10.
Per convertire un numero da BINARIO a DECIMALE, basta dare il giusto peso a ciascuna cigra.
Ad esempio, il numero binario 10111, in decimale diventa:
1*24 + 0*23 + 1*22 + 1*21 +1*20 = 23
Per convertire da DECIMALE a BINARIO, possiamo usare due metodi:
- Metodo posizionale
Individuare la maggiore potenza del 2 contenuta nel numero, sottrarla al valore in questione e proseguire
fino a che il resto sarà 0 o 1.
Ad esempio, per convertire in binario il numero decimale 27, troviamo che la massima potenza del 2 contenuta è 16 = 24 , quindi possiamo iniziare a scrivere un 1 in QUINTA posizione e calcoliamo 27-16=11.
La massima potenza del 2 contenuta in 11 è 8=23 , quindi scriviamo un 1 anche in QUARTA posizione e
calcoliamo 11-8 = 3.
La massima potenza del 2 contenuta in 3 è 21 = 2 , quindi scriviamo 0 in TERZA posizione, 1 in SECONDA
posizione e calcoliamo 3-2 =1.
A questo punto il resto è < 2 e quindi possiamo scriverlo direttamente in PRIMA posizione: quindi il risultato
della conversione del numero decimale 27 sarà 11011
- Metodo delle divisioni successive
Tenendo presente la rappresentazione posizionale, possiamo dividere il numero per 2 e quindi riportare il
resto della divisione come cifra binaria, a partire da destra. Il quoziente verrà diviso successivamente fino
ad ottenere il quoziente 0.
Ad esempio, per trasformare in binario il numero 237, si eseguono le divisioni successive:
237 2
1 118 2
0 59 2
1 29 2
11101101
1 14
0
2
7 2
1 3 2
1 1 2
1 0
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 13
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
L’aritmetica BINARIA segue le stesse regole di quella DECIMALE e di qualsiasi sistema posizionale analogo. L’unica eccezione da tener conto è che nell’aritmetica binaria, i simboli sono solo 0 e 1. Per chiarire il
concetto, effettuiamo alcune operazioni di esempio:
27 +
23 =
11011 +
10111 =
50
110010
50 27 =
110010 11011 =
23
10111
9 *
3 =
27
1001 *
11 =
1001
1001
Il procedimento è molto semplice: quando la somma è > 1, ovvero si ottiene
un risultato a due cifre, occorre scrivere la cifra a destra e riportare 1. In decimale il procedimento è analogo: quando la somma è maggiore di 9, ovvero
si ottiene un risultato a due cifre, occorre scrivere la cifra a destra e riportare
1.
Per la differenza, vale lo stesso discorso. In questo caso occorre considerare,
al posto dei riporti, gli eventuali prestiti e scalarli alla cifra più a sinistra ovvero alla cifra più significativa.
La moltiplicazione viene effettuata incolonnando opportunamente le moltiplicazioni parziali e quindi effettuando la somma.
11011
59
3
111011 11
29
2
19
00101 10011
101
10
Così come per la moltiplicazione, la divisione si esegue “abbassando” il
dividendo succesivamente e calcolando i resti con delle sottrazioni
successive. Ogni volta che si “abbassa” una cifra ed il numero è minore del
divisore, occorre accostare uno 0 al risultato.
Evitiamo di soffermarci ancora sulla rappresentazione dei numeri in binario, concentrandoci principalmente
su delle semplici regole teoriche e pratiche che possono esserci di aiuto nella comprensione e nello studio
che stiamo affrontando.
La prima osservazione che può essere fatta è che il sistema di binario, pur avendo i vantaggi (per la macchina) espressi precedentemente, risulta scomodo e non maneggevole per noi: basti pensare che per rappresentare completamente un numero di 5 cifre decimali, occorrono ben 17 cifre binarie. Per ovviare a questa barriera che ci separa dal "modo di pensare" della macchina, dovremo familiarizzare con dei semplici
problemi ricorrenti:
- IL PROBLEMA DELLA STIMA:
Molto spesso, più che conoscere l'esatta rappresentazione in binario di un numero decimale, ci serve sapere la sua entità in termini di Kilo, Mega, Giga, Tera. Per questo, dovremo ricordarci queste semplici identità:
1Kilo = 2^10 = 1024 = circa mille
1Mega = 2^20 = 1024*1024 = 1.048.576 = circa 1 milione
1Giga = 2^30 = 1024*1.048.456 = 1.073.741.824 = circa 1 miliardo
1Tera = 2^40 = 1024* 1.073.741.824 = 1.099.511.627.776 = circa mille miliardi (bilione inglese)
dove è stato messo in evidenza l'esponente della base binaria che ci indica il numero di cifre binarie necessarie per poter rappresentare il numero nella base stessa. Se inoltre, riusciamo anche a tenere a mente le
prime 10 potenze del 2 :
2
esponente->
4
1
8
2
3
16
4
32
5
64
6
128
7
256
8
512
9
1024
10
siamo in grado di dare una stima approssimata, in maniera velocissima ad ogni numero decimale, ottenendo quello che ha più importanza, ovvero il numero di cifre binarie necessarie per la sua rappresentazione.
Esempio:
Stimare il numero di cifre (digit) necessari per rappresentare in binario i seguenti numeri naturali in base
10.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 14
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
a) 1.435.785
b) 20.345.444
c) 300.456.231
a) La prima considerazione che si fa è che il numero è superiore ad 1Mega ma inferiore a 2Mega: di conseguenza il numero di digit binari necessario Sarà 21.
b) In questo caso, riguardando la successione delle prime 10 potenze del 2, vediamo che 20 è compreso
tra 16 e 32: occorre quindi aggiungere a 20, la potenza relativa al numero 32, quindi si ottiene 20+5=25.
c) Ragionando come sopra, troviamo la potenza immediatamente superiore a 300 che è 512 alla quale corrisponde un esponente pari a 9 : il numero di digit necessario sarà: 20+9=29.
Se non riusciamo a tenere a mente le prime dieci potenze del 2, possiamo ugualmente effettuare una stima. In questo caso occorre eseguire velocemente divisioni e moltiplicazioni per 2, ricordando che per ogni
moltiplicazione, si deve aggiungere 1 digit, mentre per ogni divisione, occorre togliere 1 digit. Il problema
dell'esempio precedente va cosi' risolto:
a) Si vede subito che per trovare la prossima potenza del due che contiene il numero, occorre moltiplicare
per 2: quindi 20+1=21
b) In questo caso moltiplichiamo successivamente per 2, tante volte fino a superare il numero:
20+1+1+1+1+1=25.
c) Visto che il numero è più vicino al Giga, conviene dividere per due e troviamo subito la potenza interessata: 30-1=29
Con queste regole, si può notare, inoltre, come sia immediata la stima inversa: dato il numero di digit, trovare il numero massimo rappresentabile.
Esempio:
Trovare il massimo numero rappresentabile con
a) 24 digit binari
b) 32 digit binari
c) 16 digit binari
Soluzione:
a) Basta considerare che 2^20=1Mega, e che occorre moltiplicare per 2 4 volte per ottenere la risposta:
16Mega-1.
b) Ragionando come in a, basta moltiplicare 2 volte: 4Giga-1.
c) O ricordandosi la tabella, o dividendo 4 volte per 2 a partire da 2^20, si ottiene: 64Kilo-1.
In quest'ultimo esempio si è messo in evidenza il problema dello 0 (zero). In un sistema di numerazione, il
simbolo 0, pur avendo valore nullo, è a tutti gli effetti un elemento distinto dell'alfabeto e quindi esistente
come entità non nulla. Per questo, ogni volta che si indica un valore numerico, occorre distinguere se si deve intendere il valore come QUANTITÀ o come informazione puramente numerica.
Ritornando all'esempio precedente, se il problema richiedeva:
Trovare il massimo numero di combinazioni possibili con
a) 24 digit binari
b) 32 digit binari
c) 16 digit binari
Le rispettive risposte sarebbero state:
a) 16Mega
b) 4Giga
c) 64Kilo
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 15
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.8) I sistemi di numerazione ESADECIMALE e OTTALE
Quando occorre sapere esattamente la rappresentazione binaria di un numero decimale, occorre effettuare la conversione di base. Le tecniche per la conversione sono note: in questa sede limitiamoci a qualche
osservazione:
a) Manualmente è più conveniente una conversione da base 10 a base 8 (ottale) o a base 16
(esadecimale) in quanto comporta una manipolazione di numeri formati da poche cifre (leggermente superiori al sistema decimale nell'ottale e inferiori nel sistema esadecimale).
b) Per effettuare questa conversione, invece di utilizzare pedissequamente la calcolatrice ( o PEGGIO un
programma di conversione) eseguendo successivamente le divisioni per la base e trovando il resto, provare, seguendo le tecniche esposte nel problema della stima, a trovare un numero vicino e, da qui, aggiustarlo per somme e differenze di potenze del 2.
c) Una volta trovata la rappresentazione esadecimale (o ottale) di un numero decimale, abituarsi a vedere
ogni digit come composto da 4 (3) cifre binarie, mentalmente, avendo presente lo schema dei primi 16
numeri binari:
0
0000
4
0100
8
1000
C 1100
1
0001
5
0101
9
1001
D 1101
2
0010
6
0110
A
1010
E 1110
3
0011
7
0111
B
1011
F 1111
|________ottale_______________|
|_______________________________esadecimale____________________|
Lavorando con le rappresentazioni esadecimali o ottali, risulta più agevole risolvere il problema della stima.
Per questo possiamo infatti notare che, considerando il numero di configurazioni possibili, possiamo costruire la seguente tabella:
100
200
400
1000
10000
Hex
Hex
Hex
Hex
Hex
=
400
=
1000
=
2000
= 10000
= 200000
Oct
Oct
Oct
Oct
Oct
=
256
=
512
= 1024
= 4096
= 65536
Dec
Dec
Dec
Dec
Dec
= 1/4 K
= 1/2 K
= 1K
= 4K
= 64K
-> 8 digit
-> 9 digit
-> 10 digit
-> 12 digit
-> 16 digit
che equivale, se vogliamo considerare la rappresentazione in valore, alla seguente tabella:
FF
1FF
3FF
FFF
FFFF
Hex
Hex
Hex
Hex
Hex
=
377
=
777
=
1777
=
7777
= 177777
Oct
Oct
Oct
Oct
Oct
=
255
=
511
= 1023
= 4095
= 65535
Dec
Dec
Dec
Dec
Dec
= 1/4 K
= 1/2 K
= 1K
= 4K
= 64K
-> 8 digit
-> 9 digit
-> 10 digit
-> 12 digit
-> 16 digit
L'acquisizione e l'appropriazione delle tabelle suddette, sarà un utile strumento che ci permetterà di compiere in maniera rapida valutazioni e stime precise per tutti i casi intermedi, semplicemente effettuando
delle moltiplicazioni ad una cifra e delle somme o sottrazioni.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 16
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.9) Rappresentazione BINARIA dei numeri REALI
- NUMERI RELATIVI
Fino a questo momento, abbiamo solo preso in considerazione l'insieme costituito dai numeri naturali, che
è utilizzato per risolvere problemi non aritmetici (logici o gestionali). Per poter effettuare dei calcoli aritmetici, dovremo estendere i discorsi sopra esposti al caso più generale dei numeri relativi.
In pratica, dovremo poter avere la possibilità di effettuare delle sottrazioni tra numeri, e quindi di poter
rappresentare il numero introducendo l'informazione "segno". Il costo del segno, intuitivamente, può essere
solo di un digit binario, (che nel seguito chiameremo semplicemente BIT). La rappresentazione di un numero relativo può essere fatta in due modi diversi:
a) MODULO E SEGNO
è il modo più semplice e intuitivo, si utilizza il bit più significativo per indicare con 0 un numero positivo
(+) e con 1 un numero negativo (-). Non è però questa la rappresentazione più comoda, da parte dei circuiti
logici, per poter effettuare dei calcoli (ricordiamo il full-adder).
b) COMPLEMENTO ALLA BASE
In questo caso, i numeri positivi, zero compreso occupano la prima metà delle possibili combinazioni con
n bit, mentre i numeri negativi, occupano la seconda metà. Riportiamo la seguente tabella come esempio:
-128..+127
-256..+256
-512..+511
-2048..+2047
-32768..+32767
Dec
Dec
Dec
Dec
Dec
=
80..7F
= 100..0FF
= 200..1FF
= 800..7FF
= 8000..7FFF
Hex
Hex
Hex
Hex
Hex
=
200..177
=
400..377
=
1000..0777
=
4000..3777
= 100000..077777
Oct
Oct
Oct
Oct
Oct
-> 8
-> 9
->10
->12
->16
bit
bit
bit
bit
bit
Da quanto detto, appare evidente un problema di ambiguità: infatti vediamo che 80H vale -128 nella prima riga e +128 nella seconda. Questa ambiguità può essere rimossa solo se viene definita rigorosamente
l'ampiezza della parola, ovvero il numero di bit da usare per rappresentare il numero relativo.
Questa rappresentazione è più comoda per effettuare le operazioni aritmetiche in modo automatico: sommando due numeri relativi, si ottiene immediatamente, trascurando per il momento il problema dell'overflow, il risultato corretto (es.: (+5) + (-3) = 05h + FDh = 02h = 2). Per effettuare una sottrazione, si può quindi usare un addizionatore, avendo cura di fare il complemento alla base del numero da sottrarre (es.: 15 - 8
= 0Fh - 08h = 0Fh + F8h = 07h = 7 ). Per eseguire il complemento alla base (complemento a 2) basta semplicemente invertire (= complemento a 1) tutti i bit del numero e sommare 1 (es.: -20 = -(14h) = (00010100b) = 11101011b+1 = 11101100b = ECh ).
- NUMERI REALI
Per completare l'insieme dei numeri reali, occorre dare una rappresentazione anche ai numeri razionali.
Anche in questo caso sono possibili più soluzioni ma, per i nostri scopi consideriamo solo la rappresentazione in VIRGOLA MOBILE, che consiste nell'individuare ogni numero tramite la coppia (e,m) "esponente" e
"mantissa", tali che:
N = b^e * m
(b = base = 2)
La mantissa viene espressa in forma "normalizzata" ovvero nella forma per la quale tutte le sue cifre sono
significative.
Il formato di un numero binario in virgola mobile viene espresso comunemente nel seguente modo:
[S][E][M]
con
S = Segno della mantissa
E = Esponente secondo la rappresentazione in complemento a 2
M = modulo della mantissa.
Il numero di bit da riservare per ogni campo della stringa di bit cosi' composta è variabile e dipende dalla
precisione richiesta. Di norma vengono utilizzati i seguenti dimensionamenti:
E
M
totale
errore
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
err.circa
Pagina 17
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
SINGOLA PRECISIONE: 8 bit | 23 bit | 32 bit | 2^(-23) | 10^(-7)
DOPPIA PRECISIONE : 8 bit | 55 bit | 64 bit | 2^(-55) | 10^(-17)
Esempio:
Per rappresentare il numero 10111,0011b, occorre prima normalizzarlo in 0,101110011b * 2^5 e quindi
avremo, in singola precisione:
S
binario 0
Hexadec 0
Esponente
0000 0101
05
Modulo mantissa
000 0000 0000 0001 0111 0011
000173
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 18
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.10) I CODICI DI CARATTERI
La necessità di rappresentare completamente l'informazione, porta ad estendere i concetti di rappresentazione numerica esposti precedentemente verso l'ALFABETO usato normalmente dall'uomo per comunicare.
Questo alfabeto viene denominato come ALFABETO ESTERNO ed è costituito dalle 26 lettere maiuscole e
minuscole che compongono l'alfabeto inglese, dalle 10 cifre decimali e dai vari segni di interpunzione. Non
è possibile una conversione diretta tra i simboli dell'alfabeto esterno e i simboli dell'ALFABETO INTERNO,
ovvero dell'alfabeto usato dal calcolatore in quanto quest'ultimo è dotato dei due soli simboli 0 e 1. Per poter rappresentare l'alfabeto esterno, dovremo raggruppare più bit in modo da formare delle combinazioni
che abbiano un significato.
Chiamando queste combinazioni PAROLE DEL CODICE, possiamo formalizzare le seguenti definizioni:
CODICE:
un particolare modo di comunicare secondo simboli e regole precise.
CODIFICA :
operazione che ci permette di associare ogni elemento dell'alfabeto esterno con una parola
del codice.
DECODIFICA: operazione che ci permette di associare ogni parola del codice con un elemento dell' alfabeto esterno.
è chiaro che, per poter effettuare correttamente la codifica e la decodifica, dovremo utilizzare dei CODICI
NON AMBIGUI. Per questo, dovremo trovare il numero minimo di simboli necessari affinché un codice non
sia ambiguo. Nel caso di calcolatori digitali, dove si hanno a disposizione i due simboli 0 e 1, dovrà essere,
indicando con n il numero di bit necessario e con N il numero di simboli da codificare ( appartenenti all'alfabeto esterno):
n >= m con m = intero non minore di log2 N
La disuguaglianza precedente porta evidentemente ad una ridondanza nel caso che sia n > m, ovvero
avremo dei bit in più del necessario per la non ambiguità.
Il numero di bit di cui differiscono due parole qualsiasi del codice, viene chiamata DISTANZA DI HAMMING: da quanto detto sopra avremo quindi che, per codici irridondanti avremo h = 1 (n = m), mentre per
codici ridondanti avremo h>1 ( n>m ovvero n - m bit in più).
L'uso di codici RIDONDANTI ha una grande importanza pratica in quanto ci permettono di riconoscere o
addirittura correggere eventuali errori, che possono avvenire durante la fase di trasmissione, dovuti ad una
inversione di uno o più bit. Possiamo dire che i codici con h>1, possono rivelare, al massimo, errori su h-1
bit di ogni parola del codice. Ad esempio, se abbiamo h=3, avremo che ogni parola del codice differisce da
un'altra per 3 bit, quindi tra una parola e l'altra, avremo due configurazioni che sono errate: queste due configurazioni sono tutte quelle che si possono ottenere invertendo, al massimo, due bit.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 19
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
Se un codice ha h>=3 possiamo pensare di correggere eventuali errori, scegliendo, come possibile la configurazione più vicina ad una ammessa dal codice. Il numero di bit errati che è possibile correggere, dipende dal valore di h, come vedremo più in dettaglio in seguito.
Analizziamo i codici di caratteri più usati:
1.10.1 Codice BCD (Binary Coded Decimal)
è un codice irridondante (h=1) per codificare le dieci cifre decimali (da 0 a 9) con 4 bit, secondo il sistema
di numerazione binario:
CIFRA
BCD
0
1
2
3
4
0000
0001
0010
0011
0100
CIFR
A
5
6
7
8
9
BCD
0101
0110
0111
1000
1001
L'applicazione frequente di questo codice si ha quando si debba operare nel sistema decimale in maniera
agevole e interpretabile.
É immediato pensare infatti che con 8 bit a disposizione, si ha la possibilità di memorizzare due cifre BCD:
in questo caso, il codice verrà chiamato più propriamente "packed BCD", per mettere in evidenza che un
byte può contenere due cifre decimali, al contrario del codice "unpacked BCD" dove comunque rimangono
inutilizzati 4 bit (vedi successivi codici ASCII e EBCDIC).
1.10.2 Codice GRAY (grigio)
Nei casi in cui, è necessario mantenere costante la distanza di hamming tra due codici successivi, occorre
utilizzare una successione non binaria. è questo il caso di contatori che trasmettono su delle linee dove è
necessario ridurre al minimo la generazione di armoniche che possono produrre errori. Infatti, mantenendo
costante la distanza di hamming, non si corre il rischio di passare da una configurazione in cui quasi tutti i
bit sono a 1, ad una dove solo un bit è a 1 (es.: da 0111 a 1000) che può produrre delle armoniche di energia consistente e quindi la possibilità di errori dovuti agli accoppiamenti induttivi e capacitivi tra i conduttori.
Il codice GRAY a due bit sarà quindi:
00
01 11
10
Per passare dal codice GRAY a n bit a quello a n+1 bit, basta usare la seguente regola pratica (da cui il
nome di codice RIFLESSO):
• riscrivere il codice a n bit in forma speculare, ovvero dall'ultima configurazione alla prima.
• premettere uno 0 davanti alle vecchie configurazioni e un 1 davanti alle nuove configurazioni.
Ad esempio, ricaviamo il codice GRAY a 3 bit, da quello a 2 bit: riscrivo il codice riflesso:
10
11 01 00
combino vecchio e nuovo codice:
000 001
011
010
110
111
101
100
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 20
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.10.3 Codice EBCDIC (Extended Binary Coded Decimal Interchange Code)
è un codice adottato essenzialmente per trasmissione dati e soprattutto per applicazioni gestionali. Esso è
una estensione del codice BCD, per poter rappresentare tutti i simboli dell'alfabeto esterno: I digit da 0 a 9
hanno i 4 bit più a sinistra fissi a 1. La tabella completa è la seguente:
binario
00000000
00000001
00000010
00000011
00000100
00000101
00000110
00000111
00001000
00001001
00001010
00001011
00001100
00001101
00001110
00001111
00010000
00010001
00010010
00010011
00010100
00010101
00010110
00010111
00011000
00011001
00011010
00011011
00011100
00011101
00011110
00011111
00100000
00100001
00100010
00100011
00100100
00100101
00100110
00100111
00101000
00101001
00101010
00101011
00101100
00101101
00101110
00101111
Hex
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
Oct
000
001
002
003
004
005
006
007
010
011
012
013
014
015
016
017
020
021
022
023
024
025
026
027
030
031
032
033
034
035
036
037
040
041
042
043
044
045
046
047
050
051
052
053
054
055
056
057
Dec
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Char
NUL
SOH
STX
ETX
PF
HT
LC
DEL
TAB
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
TM
RES
NL
BS
IL
CAN
EM
CC
CC1
IFS
IGS
IRS
IUS
DS
SOS
FS
BYP
LF
ETB
ESC
SM
CU2
ENQ
ACK
BEL
binario
10000000
10000001
10000010
10000011
10000100
10000101
10000110
10000111
10001000
10001001
10001010
10001011
10001100
10001101
10001110
10001111
10010000
10010001
10010010
10010011
10010100
10010101
10010110
10010111
10011000
10011001
10011010
10011011
10011100
10011101
10011110
10011111
10100000
10100001
10100010
10100011
10100100
10100101
10100110
10100111
10101000
10101001
10101010
10101011
10101100
10101101
10101110
10101111
Hex
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
AA
AB
AC
AD
AE
AF
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Oct
200
201
202
203
204
205
206
207
210
211
212
213
214
215
216
217
220
221
222
223
224
225
226
227
230
231
232
233
234
235
236
237
240
241
242
243
244
245
246
247
250
251
252
253
254
255
256
257
Dec Char
128
129
a
130
b
131
c
132
d
133
e
134
f
135
g
136
h
137
i
138
139
140
141
142
143
144
145
j
146
k
147
l
148
m
149
n
150
o
151
p
152
q
153
r
154
155
156
157
158
159
160
161
162
s
163
t
164
u
165
v
166
w
167
x
168
y
169
z
170
171
172
173
174
175
Pagina 21
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
binario Hex
00110000 30
00110001 31
00110010 32
00110011 33
00110100 34
00110101 35
00110110 36
00110111 37
00111000 38
00111001 39
00111010 3A
00111011 3B
00111100 3C
00111101 3D
00111110 3E
00111111 3F
01000000 40
01000001 41
01000010 42
01000011 43
01000100 44
01000101 45
01000110 46
01000111 47
01001000 48
01001001 49
01001010 4A
01001011 4B
01001100 4C
01001101 4D
01001110 4E
01001111 4F
01010000 50
01010001 51
01010010 52
01010011 53
01010100 54
01010101 55
01010110 56
01010111 57
01011000 58
01011001 59
01011010 5A
01011011 5B
01011100 5C
01011101 5D
01011110 5E
01011111 5F
Oct
060
061
062
063
064
065
066
067
070
071
072
073
074
075
076
077
100
101
102
103
104
105
106
107
110
111
112
113
114
115
116
117
120
121
122
123
124
125
126
127
130
131
132
133
134
135
136
137
Dec
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Char
SYN
PN
RS
UC
EOT
CU3
DC4
NAK
SUB
SP
C\
.
<
(
+
|
&
!
$
*
)
;
§
binario Hex Oct Dec
10110000
B0
10110001
B1
10110010
B2
10110011
B3
10110100
B4
10110101
B5
10110110
B6
10110111
B7
10111000
B8
10111001
B9
10111010
BA
10111011
BB
10111100
BC
10111101
BD
10111110
BE
10111111
BF
11000000
C0
11000001
C1
11000010
C2
11000011
C3
11000100
C4
11000101
C5
11000110
C6
11000111
C7
11001000
C8
11001001
C9
11001010
CA
11001011
CB
11001100
CC
11001101
CD
11001110
CE
11001111
CF
11010000
D0
11010001
D1
11010010
D2
11010011
D3
11010100
D4
11010101
D5
11010110
D6
11010111
D7
11011000
D8
11011001
D9
11011010
DA
11011011
DB
11011100
DC
11011101
DD
11011110
DE
11011111
DF
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Char
260
261
262
263
264
265
266
267
270
271
272
273
274
275
276
277
300
301
302
303
304
305
306
307
310
311
312
313
314
315
316
317
320
321
322
323
324
325
326
327
330
331
332
333
334
335
336
337
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
Pagina 22
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
binario Hex
01100000 60
01100001 61
01100010 62
01100011 63
01100100 64
01100101 65
01100110 66
01100111 67
01101000 68
01101001 69
01101010 6A
01101011 6B
01101100 6C
01101101 6D
01101110 6E
01101111 6F
01110000 70
01110001 71
01110010 72
01110011 73
01110100 74
01110101 75
01110110 76
01110111 77
01111000 78
01111001 79
01111010 7A
01111011 7B
01111100 7C
01111101 7D
01111110 7E
01111111 7F
Oct
140
141
142
143
144
145
146
147
150
151
152
153
154
155
156
157
160
161
162
163
164
165
166
167
170
171
172
173
174
175
176
177
Dec
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Char
/
,
%
>
?
:
#
@
'
=
"
binario Hex Oct Dec
11100000
E0
11100001
E1
11100010
E2
11100011
E3
11100100
E4
11100101
E5
11100110
E6
11100111
E7
11101000
E8
11101001
E9
11101010
EA
11101011
EB
11101100
EC
11101101
ED
11101110
EE
11101111
EF
11110000
F0
11110001
F1
11110010
F2
11110011
F3
11110100
F4
11110101
F5
11110110
F6
11110111
F7
11111000
F8
11111001
F9
11111010
FA
11111011
FB
11111100
FC
11111101
FD
11111110
FE
11111111
FF
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Char
340
341
342
343
344
345
346
347
350
351
352
353
354
355
356
357
360
361
362
363
364
365
366
367
370
371
372
373
374
375
376
377
224
225
226
227
228
229
220
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
S
T
U
V
W
X
Y
Z
0
1
2
3
4
5
6
7
8
9
Pagina 23
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.10.4 Codice ASCII (American Standard Code Information Interchange)
É un codice binario a sette bit, in grado di rappresentare 128 simboli diversi. Questo codice, pubblicato nel
1968 come ANSI X3.4, è stato il più usato, sia per la rappresentazione dei dati, sia per lo scambio di informazioni tra sistemi diversi.
b6-b4
0
(000)
1
(001)
2
(010)
3
(011)
4
(100)
5
(101(
6
(110)
7
(111)
0 (0000)
1 (0001)
2 (0010)
3 (0011)
4 (0100)
5 (0101)
6 (0110)
7 (0111)
8 (1000)
9 (1001)
A (1010)
B (1011)
C (1100)
D (1101)
E (1110)
F (1111)
NUL
STX
SOT
ETX
EOT
ENQ
ACK
BEL
BS
TAB
LF
VT
FF
CR
SI
SO
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
SP
!
“
#
$
%
&
‘
(
)
*
+
,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL
b3-b0
NUL Carattere Nullo
STX Start Transmission
SOT Start Of Text
ETX End Of Transmiss.
EOT End Of Text
ENQ Enquiry
ACK Acknowledge
BEL Bell (campanello)
BS BackSpace
TAB
LF
VT
FF
CR
SI
SO
DLE
DC1
Horizontal Tabul.
Line Feed
Vertical Tabulation
Form Feeed
Carriage Return
Shift In
Shift Out
DC2 Device Control 2
DC3 Device Control 3
DC4 Device Control 4
NAK Negative Acknow.
SYN Synchronize
ETB
CAN Cancel
EM End Mark
Device Control 1
SUB
Tabella dei codici ASCII
ESC
FS
GS
RS
US
SP
DEL
Escape
Frame Separator
Group Separator
Spazio
Delete character
Strutturalmente, può essere considerato come costituito da 4 parti, ciascuna da 32 combinazioni: la prima
(da 00 a 1F) è riservata a dei caratteri di controllo, ovvero a dei caratteri che assumono significato a seconda dei in determinato protocollo o formato di dati. La seconda (da 20 a 3F) è riservata ai segni di interpunzione, aritmetici e logici, nonché alla rappresentazione delle 10 cifre decimali da 0 a 9 (da 30 a 39).
Le ultime due parti sono riservate alla rappresentazione delle lettere dell'alfabeto MAIUSCOLE e MINUSCOLE (da 40 a 5F e da 60 a 7F rispettivamente). Ovviamente, essendo 26 le lettere dell'alfabeto inglese,
nelle due ultime parti saranno rappresentati ulteriori caratteri speciali e di interpunzione. La codifica scelta è
stata studiata con particolare riguardo ai problemi di conversione. Ad esempio, per passare da ASCII a
BCD, basta mascherare i 3 bit più significativi; per trasformare una stringa composta da lettere minuscole in
una stringa in lettere maiuscole, occorre semplicemente operare sul bit b5: forzando b5 = 0 ho il carattere
maiuscolo, forzando b5 = 1 ho il corrispondente carattere minuscolo).
In molti casi, ai sette bit del codice ASCII, viene aggiunto un ottavo bit, con significati diversi: per la trasmissione di informazioni, l'ottavo bit è un bit ridondante, che trasforma il codice in h=2 e permette di rilevare un errore su un singolo bit di un carattere. L'ottavo bit, in questo caso, viene chiamato CODICE DI PARITÀ in quanto il suo valore è determinato in modo tale da rendere sempre pari (codici a parità pari "PARITY
EVEN") o sempre dispari (codici a parità dispari "PARITY ODD") il numero complessivo di bit "1".
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 24
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.10.5 Code Pages proprietarie
Nel 1980, con la diffusione sempre crescente dei Personal Computer, non essendo ancora stato riconosciuto alcun standard per l’estensione del codice ascii a 8 bit per poterlo utilizzare con caratteri
“internazionali”, molti costruttori inventarono il proprio codice di caratteri. Primo fra tutti Microsoft con le Code Pages per MS-DOS:
CP437 (DOSLatinUS)
Il primo codice conosciuto nei PC IBM è la famosa CP437 che premetteva una serie di caratteri semigrafici
(per disegnare cornici) a singola e doppia linea ed un po’ di lettere accentate.
I codici da 20 a 7F rispettano la codifica ASCII, mentre i codici di controllo (da 00 a 1F) sono stati sostituiti
da simboli grafici: questo costituisce un’incongruenza per le funzioni di output, in quanto, stampando ad
esempio 0D viene eseguito un CR mentre, scrivendo direttamente nella memoria video si ottiene il simbolo
sopra descritto.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 25
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
CP850 (DOSLatin1)
Con le versioni successive di MS-DOS, si ebbe la possibilità di cambiare dinamicamente il set di caratteri
della scheda video (VGA) e quindi vennero introdotte ulteriori “Code Pages” come la CP850 che conservava in posizioni compatibili col la 437 i caratteri semigrafici. Le modifiche erano essenzialmente nel set da 80
a 7F.
CP852 (DOSLatin2)
Come la CP850, ma con set di caratteri per l’Europa dell’est.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 26
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
CP855 (DOSCyrillic)
In questa codepage vengono introdotti i carattteri cirillici
CP866 (DOSCyrillicRussian)
Segue immediatamente la CP855 e rappresenta una correzione della precedente in modo da rispettare
l’ordinamento alfabetico Russo.
Questa venne successivamente rimpiazzata da un’ulteriore versione, largamente usata da tutte le lingue
cirilliche.
Inoltre, senza entrare nel dettaglio di ciascuna, vennero messe a disposizione le seguenti code pages:
• CP874 (DOSThai)
• CP737 (DOSGreek)
• CP775 (DOSBaltRim)
• CP857 (DOSTurkish)
• CP860 (DOSPortuguese)
• CP861 (DOSIcelandic)
• CP862 (DOSHebrew)
• CP863 (DOSCanadaF)
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
• CP864 (DOSArabic)
• CP865 (DOSNordic)
• CP869 (DOSGreek2)
Pagina 27
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
Con l’avvento di Windows, Microsoft abbandona la compatibilità della semigrafica con la CP437 e costruisce delle copepage simili alla famiglia ISO-8859:
CP1252 (WinLatin1) derivata da ISO 8859-1
CP1250 (WinLatin2) derivata da ISO 8859-2
ed inoltre le:
• CP1251 (WinCyrillic), spacciata per standard ma incompatibile, nell’ordine dei caratteri, con la corrispondente ISO 8859-5
• CP1257 (WinBaltic) compatibile con la ISO 8859-13 (Latin-7)
• 1253 (WinGreek) è differente dalla ISO-8859-7 nella posizione delle lettere maiuscole con accento e su
qualche simbolo
• 1254 (WinTurkish) fa le stesse sostituzioni della ISO-8859-9 rispetto alla ISO-8859-1.
• 1255 (WinHebrew) compatibile con ISO-8859-8.
• 1256 (WinArabic) Conserva i simboli e le lettere minuscole della WinLatin1 ed inserisce le lettere arabe
nelle altre posizioni. La prima metà dell’alfabeto arabo è compatibile con ISO-8859-6.
• 1257 (WinBaltic) compatibile con ISOLatin7.
• 1258 (WinVietnamese) molto simile alla WinLatin1
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 28
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.10.6 Codici standard ISO/IEC 2022
Poiché il set di caratteri definiti dal codice ASCII non era sufficiente per rappresentare compiutamente i
caratteri tipografici utilizzati nelle diverse nazioni europee, nel 1967 il sottocomitato ISO/TC97/SC2, ha introdotto la raccomandazione ISO 646 che permetteva di introdurre 10 varianti “nazionali” al codice ASCII,
all’interno dei 94 caratteri stampabili, con l’intesa che, se non erano tutte richieste, le rimanenti dovevano
assumere l’assegnazione di default.
Questa raccomandazione diviene uno standard nel 1983 e nel 1991 viene pubblicata la terza edizione di
questo standard (ISO/IEC 646:1991) che aggiunge ulteriori due caratteri alternativi: # alternativo a £ e $
alternativo al simbolo monetario nazionale.
Questa “standardizzazione”, purtroppo creò più danni che benefici in quanto la sostituzione di caratteri
ormai acquisiti come standard, ovvero quelli del set ASCII a 7 bit, erano stati utilizzati da linguaggi di programmazione come il C-language. Così, ad esempio, utilizzando una variante nazionale ASCII come la
German DIN 66003, un’istruzione C del tipo:
{*argv[1]='\0'}
risultava visualizzata come:
æ*argvÆ1Å='Ø0'å
Considerato che i computer operano comunque con 8 bit, considerato che la diffusione dei Personal Computer stava imponendo una standardizzazione de facto (Code Page 437 e successive) nell’uso dei codici
estesi, la naturale estensione del set di caratteri ASCII era quella di aggiungere ulteriori caratteri utilizzando
un secondo set di 94 caratteri identificati dal fatto di avere il bit più significativo a 1. Tale set di caratteri
poteva essere comunque trasmesso su un canale a 7 bit, utilizzando i codici di controllo SI (Shift In) e SO
(Shift Out) per attivare e disattivare (shift lock) i codici estesi. In questo caso, poiché non era necessario
duplicare i caratteri “spazio” (32) e “delete” (127), si avevano a disposizione 96 caratteri completi. La prima
conseguenza di tale approccio era di avere i codici di controllo in due aree diverse: "000xxxxx" e
"100xxxxx" ed i caratteri stampabili in due aree: la prima da 94 caratteri, la seconda da 96 per un totale di
190 caratteri definibili.
Il codice a 8 bit così formato permette di definire le lettere accentate e con segni diacritici o le lettere greche nella seconda metà, ma non entrambe. Per poter averle entrambe si è inserita un’ulteriore estensione
ovvero un secondo set di 2 codici a 7 bit da poter caricare tramite un codice di controllo in modo da avere
attiva, nella parte alta e bassa due qualsiasi dei codici a 7 bit. Il limite di 4 codici da 7 bit è in effetti arbitrario: si potrebbero definire ulteriori codici a 7 bit “parcheggiati” ed altrettanti meccanismi di “shift lock” per richiamarli. D’altra parte 4 codici sono sufficienti per la maggior parte delle necessità per cui non vi era ragione ad aumentarli.
Nasce così lo standard ISO/IEC 2022, ispirato, nel meccanismo, al funzionamento di una macchina per
scrivere con testina di stampa intercambiabile:
• Una macchina per scrivere priva di testina non è in grado di stampare caratteri ma tutti i tasti che non
stampano caratteri continuano a funzionare regolarmente ( spazio, backspace, ...). Una testina da sola è
un oggetto inerte ma una volta inserita in una macchina per scrivere stamperà il carattere definito per
ogni posizione specifica; cambiando la testina, la macchina stamperà caratteri differenti ma la corrispondenza tra tasto e posizione nella testina non cambierà.
• Il ruolo della macchina per scrivere è svolto da una code table: occorre definire due code table: una per
codici a 7 bit ed un’altra per codici a 8 bit. Ciascuna code table stabilisce la corrispondenza tra la posizione del carattere e la combinazione di bit; alcune di queste posizioni sono già assegnate (spazio, Delete, Escape) ma gli altri sono tutti disponibili.
• Il ruolo della testina di stampa è svolto da un code element di caratteri grafici: un code element contiene
una sequenza di caratteri grafici che sono destinati a ricoprire le posizioni vuote (non assegnate) su una
code table ; una volta ricoperte queste posizioni, ovvero dopo aver inserito la testina di stampa nella
macchina per scrivere, avremo che ad ogni combinazione di bit corrisponderà un preciso carattere.
Per comunicare ad un eventuale sistema collegato che tipo di codifica (testina di stampa) si intende
adottare, ci si basa su un registro internazionale (definito nella ISO 2375) che raccoglie le definizioni di tali
codifiche.
Ciascun codice e le variazioni (IRV = International Reference Version) sono registrati con la sigla ISO-IR-x
dove x è il numero identificativo della registrazione. Così, ad esempio, l’IRV dello standard ISO 646:1983 è
ISO-IR 2, mentre quello ISO 646:1991 è ISO-IR 6.
Attualmente il registro “ISO 2375”, pubbblicato dall’ECMA sotto l’autorità dell’ISO, è costituito dal oltre 900
pagine e contiene oltre 180 set di codici di caratteri
La struttura della code table e del code element, secondo lo standard ISO/IEC 2022 sono così definite:
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 29
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
- Code table
Una code table a 7 bit è organizzata in 8 colonne e 16 righe per un totale di 128 posizioni.
Una code table a 8 bit è organizzata in 16 colonne e 16 righe per un totale di 256 posizioni.
00
00
01
02
13
04
05
06
07
08
09
10
11
12
13
14
15
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
SP
CL
a
r
e
a
GL
a
r
e
a
CR
a
r
e
a
GR
a
r
e
a
ESC
DEL
struttura di una code table a 8 bit
Per indicare la posizione della tabella di colonna xx e riga yy si utilizza la notazione xx/yy; la stessa notazione è usata per identificare la combinazione dei bit in cui yy indica il numero decimale corrispondente ai 4
bit meno significativi e xx indica il numero decimale corrispondente ai 4 (3 per code table a 7bit) bit più significativi.
Una code table a 8 bit è formata da quattro aree:
• CL area, costituita dalle colonne 00 e 01
• GL area, costituita dalle colonne da 02 a 07
• GL area, costituita dalle colonne 08 e 09
• GR area, costituita dalle colonne da 10 a 15
Una code table a 7 bit, ovviamente sarà formata dalle sole aree CL e GL
ISO/IEC 2022 impone che le aree CL e CR debbono essere lasciate inutilizzate in quanto destinate a funzioni di controllo: solo le aree GL e GR possono essere utilizzate per rappresentare i caratteri grafici di
stampa.
Alcuni caratteri, per mantenere la continuità con il codice ascii hanno assegnazione fissa e sono:
• ESCAPE (ESC) in posizione 01/11
• SPACE (SP) in posizione 02/00
• DELETE (DEL) in posizione 07/15
- Code elements
Un codice completo viene costruito in base ai seguenti code elements:
•
Quattro code elements chiamati G0, G1, G2 e G3 contenenti i caratteri
grafici, organizzati come possibili sovrapposizioni delle aree GL e GR
della code table a 8 bit; G0 può avere solo 94 posizioni e può essere caricato solo nell’area GL; G1, G2, G3 possono avere fino a 96 caratteri e
possono essere caricati sia in GL che in GR. Ovviamente, quando caricati in GR, le posizioni 02/00 e 07/15 non verranno caricate.
A fianco viene riportata un esempio (codice ASCII) di Gn a 94 caratteri
che può essere caricata in GL.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
!
“
#
$
%
&
‘
(
)
0
1
2
3
4
5
6
7
8
9
@ P
A Q
B R
C S
D T
E U
F V
G W
H X
I Y
`
a
b
c
d
e
f
g
h
i
p
q
r
s
t
u
v
w
x
y
Pagina 30
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
*
+
,
.
•
•
:
;
<
=
>
J
K
L
M
N
Z
[
\
]
^
j
k
l
m
n
z
{
|
}
~
/
?
O
_
o
Due code elements chiamati C0 e C1 contenenti caratteri di controllo, organizzati come possibili sovrapposizioni delle aree CL e CR della code table a 8 bit; questi definiscono quindi l’associazione a caratteri di controllo non stampabili. Normalmente C0 viene caricato fisso in CL e C1 in CR: per le code table a 7 bit, è possibile definire il code element C1 e richiamarlo tramite funzioni di escape (possibile anche per le code table a 8 bit, purché non si usi l’accesso diretto a GR - una sola delle due alternative è
permessa)
Un numero (anche zero) di altre funzioni di controllo.
Ovviamente un tale sistema di gestione è soggetto a limitazioni dovute al fatto che non tutti i protocolli di
comunicazione hanno la possibilità di gestire un sistema così complesso. In questi casi, si definiscono delle
funzioni di controllo di annuncio che dovranno permettere di annunciare al sistema di destinazione che, ad
esempio, si vorrà usare solo un codice a 7 o 8 bit senza capacità di estensione del codice.
Le funzioni di controllo si definiscono tramite una escape sequence (o sequenza escape). Una sequenza
escape è generalmente costituita da due o più caratteri secondo il seguente formato generale:
<ESC> <zero o più bytes intermedi di colonna 02> <byte finale da colonna 03 a colonna 07 escluso DEL>
possiamo classificare le sequenze escape in base al numero di caratteri utilizzati, compreso ESC:
• sequenze a 2 bytes (0 bytes intermedi) a loro volta classificate in base alla colonna del byte finale:
• colonna 03: funzioni di controllo per uso privato e riconosciute da entrambe le parti in comunicazione.
• colonne 04 e 05: usate per la rappresentazione delle funzioni del code element C1
• colonne 06 e 07: funzioni di controllo standardizzate ISO 2375 (locking shitf, ...)
• sequenze con bytes intermedi a loro volta classificate in base al primo carattere intermedio usato:
• 02/00 :funzioni di annuncio; esempi: ESC 02/00 04/06 comunica che, in un 8-bit code, l‘elemento C1
non potrà essere richiamato nell’area CR. ESC 02/00 04/07 comunica che, in un 8-bit code,
l’elemento C1 potrà essere richiamato nell’area CR. ESC 02/00 05/12 comunica che, in un 8-bit code,
l’area associata al single shift sarà la GR.
• 02/01 e 02/02 : definisce le funzioni di controllo dei set C0 e C1. Ad esempio 01/01 04/00 invoca il set
C0 (ISO-IR 1); 02/02 04/03 invoca il set C1 (ISO-IR 77)
• 02/03 : ulteriori funzioni di controllo previste in ISO 2375
• 02/04 : funzioni per la definizione di caratteri grafici a più bytes
• 02/05 : indica un’eccezione dalla struttura ISO/IEC 2022 per individuare altri sistemi di codifica
• 02/06 : indica una revisione di una registrazione ISO 2375: è seguita da un byte che identifica il numero di revisione, a partire da 04/00 (prima revisione) in poi.
• 02/07 e 02/12 : riservate per future standardizzazioni
• da 02/08 a 02/11 e da 02/13 a 02/15 : usate per identificare il set di caratteri grafico a byte singolo.
I locking shift , in analogia al tasto “blocca maiuscole”, permettono di estendere il codice a 7 o 8 bit invocando il caricamento dei code element G0, G1, G2, G3 nelle aree GL e GR. Sono previsti 7 locking shift in
quanto G0 non può essere caricato nell’area GR.
Due di questi shift sono definiti nel set C0:
• LOCKING SHIFT ZERO (LS0 = 00/15 = SI = shift IN) permette di caricare il set G0 nell’area GL
• LOCKING SHIFT ONE (LS1 = 00/14 = SO = shift OUT) permette di caricare il set G1 nell’area GL
i rimanenti 5 locking shift sono rappresentati come sequenze escape standard:
• LOCKING SHIFT TWO (LS2 = ESC 06/14), permette di caricare il set G2 nell’area GL (ISO-IR 62)
• LOCKING-SHIFT THREE (LS3 = ESC 06/15), permette di caricare il set G3 nell’area GL (ISO-IR 63)
• LOCKING-SHIFT ONE RIGHT (LS1R = ESC 07/14), permette di caricare il set G1 nell’area GR (ISO-IR
66)
• LOCKING-SHIFT TWO RIGHT (LS2R = ESC 07/13), permette di caricare il set G2 nell’area GR (ISO-IR
65)
• LOCKING-SHIFT THREE RIGHT (LS3R = ESC 07/12), permette di caricare il set G3 nell’area GR (ISOIR 64)
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 31
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
I single shift , in analogia ai tasti “shift” o “alt” o “Ctrl”, permettono di definire il caricamento di un set grafico valido solo per il prossimo carattere. Occorre prima accordarsi (ad esempio tramite una funzione di annuncio) su quale area (GL o GR) si desidera caricare il set.
Il set ISO/IEC 6429 prevede i seguenti:
• SINGLE-SHIFT TWO (SS2) permette di caricare il set G2 nell’area GL o GR
• SINGLE-SHIFT THREE (SS3) permette di caricare il set G3 nell’area GL
E’ permesso inserire i single shift nel set primario (C0) delle funzioni di controllo. Un esempio di tale uso è il
set ISO-IR 106: Teletex primary set of Control Functions della raccomandazione CCITT T.61.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 32
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
1.10.7 Codice ISO 8859
Il codice, viene progettato dall’ECMA (European Computer Manufacturer's Association), ma adottato come
standard ISO solo nel 1987. Attualmente viene revisionato da un gruppo di lavoro costituito dalle associazioni ISO/IEC/JTC1/SC2/WG3. Il codice, in realtà è costituito da una “famiglia” di codici che hanno in comune il “code element” G0 da caricare nell’area GL, identico al codice ASCII. Ciascuna famiglia, quindi definisce il relativo codice G1 da associare all’area GR e quindi definisce nell’insieme un codice ad 8 bit.
Attualmente il registro ISO 2375 contiene le seguenti registrazioni principali e le relative funzioni di controllo per lo “shift-lock”
:
•ISO-IR 6 (ESC 02/08 04/02) : International Reference Version of ISO/IEC 646:1991
•ISO-IR 100 (ESC gg 04/01) : Latin Alphabet No.1, Supplementary Set (GR area of ISO 8859-1)
•ISO-IR 101 (ESC gg 04/02) : Latin Alphabet No.2, Supplementary Set (GR area of ISO 8859-2)
•ISO-IR 109 (ESC gg 04/03) : Latin Alphabet No.3, Supplementary Set (GR area of ISO 8859-3)
•ISO-IR 110 (ESC gg 04/04) : Latin Alphabet No.4, Supplementary Set (GR area of ISO 8859-4)
•ISO-IR 148 (ESC gg 04/13) : Latin Alphabet No.5, Supplementary Set (GR area of ISO/IEC 8859-9)
•ISO-IR 144 (ESC gg 04/12) : Cyrillic Supplementary Set (GR area of ISO/IEC 8859-5)
•ISO-IR 127 (ESC gg 04/07) : Arabic Supplementary Set (GR area of ISO 8859- 6)
•ISO-IR 126 (ESC gg 04/06) : Greek Supplementary Set (GR area of ISO 8859- 7)
•ISO-IR 138 (ESC gg 04/08) : Hebrew Supplementary Set (GR area of ISO 8859- 8)
•ISO-IR 154 (ESC gg 05/00) : Supplementary Set for Latin Alphabets No.1 or No.5, and No.2
•ISO-IR 155 (ESC gg 05/01) : Basic Box Drawing Set
•ISO-IR 156 (ESC gg 05/02) : Supplementary Set of ISO/IEC 6937
ISO 8859 is a full series of now 10 (and soon even more) standardized multilingual single-byte coded (8bit)
graphic character sets for writing in alphabetic languages:
1.Latin1 (West European) 2.Latin2 (East European) 3.Latin3 (South European) 4.Latin4 (North European)
5.Cyrillic 6.Arabic 7.Greek 8.Hebrew 9.Latin5 (Turkish) 10.Latin6 (Nordic)
- Part 1: Latin Alphabet No.1 (1987)
- Part 2: Latin Alphabet No.2 (1987)
- Part 3: Latin Alphabet No.3 (1988)
- Part 4: Latin Alphabet No.4 (1988)
- Part 6: Latin/Arabic Alphabet (1987)
- Part 7: Latin/Greek Alphabet (1987)
- Part 8: Latin/Hebrew Alphabet (1988)
The remaining current (first) editions of its parts were published under the auspices of ISO/IEC JTC1/SC2.
These are:
ISO/IEC 8859
Information technology - 8-bit single-byte coded graphic character sets
- Part 5: Latin/Cyrillic Alphabet (1988)
- Part 9: Latin Alphabet No.5 (1989)
- Part 10: Latin Alphabet No.6 (1992)
gg si riferisce al “code element” e vale 02/08 per G0, 02/09 per G1, 02/10 per G2, 02/11 per G3.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 33
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
The summary of this section on the world after ASCII has skipped over a number of difficulties that arise in
these code extension techniques. In particular, attention has been concentrated on the printing characters.
The control characters also have their extension problems. An account with greater precision is given in the
section on concepts and definitions.
To return to the table of contents click here.
The future is 16-bit
With the growing processing power of computers and the increasing bandwidth of communications channels, the pressure to squeeze an ever increasing number of characters into an 8-bit code structure has diminished. A need has arisen for a simpler structure at the expense of more bits. This need has given rise to a
complete rethinking of code structure for a world of 16-bit and even 32-bit processing and communication.
From it has risen a new international standard, ISO/IEC 10646, the Universal Multiple-Octet Coded Character Set.
It is interesting to note that even this "ultimate" standard retains some past legacies. Control functions are
coded according to ISO/IEC 2022, although the code extension functions of that standard are forbidden.
The first 32 bit combinations are therefore reserved for control purposes. The next 95 bit combinations
contain the printing characters of ASCII including SPACE. This brings one to the bit combination
"00...001111111" (the dots denote enough zeroes to fill either 16 or 32 bits, as the case may be). The legacy
of paper tape survives. This is still reserved for the DELETE character!
It is the intention that ISO/IEC 10646 will be, in some sense, the last character set standard. It is planned as
a multi-part standard, of which part 1 was published in 1993. Future parts will add to the code, and since it
has the potential to fill a 32-bit code space, it has the capacity to be extended to meet all foreseeable future
needs. It has the ultimate aim of including all characters that have ever been used for communication. The
coding of ancient runes is currently being standardized, that of Egyptian hieroglyphics is for future study.
To return to the table of contents click here.
See Disclaimer
-
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 34
Università degli Studi di Camerino - Diploma di Laurea in Informatica - Corso di Architettura degli Elaboratori
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani
Codici di HAMMING A CORREZIONE DI ERRORE
Precedentemente, abbiamo detto che i codici con h>2 sono i codici che permettono la correzione di uno o
piu bit errati: codici con queste proprietà sono chiamati codici di Hamming.
Il più semplice codice di Hamming, ha h=3 ed è strutturato su parole lunghe m = n+k bit, dove n = numero
di bit del codice irridondante e k = numero di bit di controllo necessari per avere h=3.
Per ricavare il numero di bit necessari per avere h=3, basta considerare che il numero di combinazioni aggiunte dai k bit deve essere superiore al numero di combinazioni possibili con gli m = n+k bit. Le combinazioni possibili con k bit sono 2^k: per rilevare un errore su n+k bit, dovrà essere 2^k >= n+k+1. Ricaviamo
quindi la seguente tabella valida per h=3:
k=2
k=3
k=4
k=5
k=6
per
per
per
per
per
n=1
2 <= n <=4
5 <= n <=11
12 <= n <=26
27 <= n <=57
Dalla tabella, possiamo vedere che, per correggere un errore su un codice ascii da 7 bit, occorrono 4 bit di
controllo.
A questo punto, resta da stabilire come utilizzare questi bit aggiuntivi. Una regola pratica consiste nel posizionare i bit di controllo nelle posizioni di indice 2^i (i=0,1,...k-1); ognuno di questi bit, controlla la parità di
tutti i bit posizionalmente associati, ovvero di quei bit il cui indice, se espresso in binario, ha un "1" nella posizione i. Chiariamo questo concetto con un esempio:
Si voglia trasmettere il codice ascii di "S" = 1010011
consideriamo la seguente struttura guida per i 7+4 bit necessari:
b6
b5
b4
h3
b3
b2
b1
h2
b0
h1
h0
1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001
11
10
9
8
7
6
5
4
3
2
1
h0 controlla la parità di : b6,b4,b3,b1,b0
h1 controlla la parità di : b6,b5,b3,b2,b0
h2 controlla la parità di : b3,b2,b1
h3 controlla la parità di : b6,b5,b4
b6 b5 b4 b3 b2 b1 b0
ricavo i codici di controllo: per "S" = 1 0 1 0 0 1 1
h0->11011 = 0
h1->10001 = 0
h2->001 = 1
h3->101 = 0
stringa di trasmissione = 101(0)001(1)1(0)(0)
Vediamo come si possa rilevare un errore su un bit, supponiamo che venga ricevuto il codice:
b6 b5 b4 h3 b3 b2 b1 h2 b0 h1 h0
1 0 1 0 0 0 1 0 1 0 0
Costruiamo un numero di controllo per le parità
c0->h0,b6,b4,b3,b1,b0->011011 = 0
c1->h1,b6,b5,b3,b2,b0->010001 = 0
c2->h2,b3,b2,b1
->0001 = 1
c3->h3,b6,b5,b4
->0101 = 0
da cui Nc=0100 => il bit di posizione 4 è errato.
Appunti delle lezioni teoriche A.A. 1998-99 - Prof. Ing. Massimo Trojani -
Pagina 35
Scarica

Pagina 1 1) - Richiami Fondamentali e Metodologie