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