10 Sistemi di numerazione -...

71
1 A P P U N T I D I S I S T E M I

Transcript of 10 Sistemi di numerazione -...

1

A P P U N T I

D I S I S T E M I

2

Sistemi di numerazione

Un sistema di numerazione è l’insieme dei simboli e delle regole che permettono di esprimere i numeri. Le cifre sono i simboli usati in un sistema di numerazione. Si dice base di un sistema di numerazione il numero di simboli che si usano per scrivere i numeri. Un sistema di numerazione si dice posizionale se il valore di una cifra dipende dalla posizione che essa occupa nella scrittura del numero. Nel numero decimale 111 è evidente che l’ uno più a destra ha un “peso” minore rispetto a quello centrale e ancor di più rispetto a quello più a sinistra. Infatti il numero si può rappresentare secondo la scrittura polinomiale per cui ogni cifra a partire da destra viene moltiplicata per la base elevata ad una potenza che rappresenta la posizione della cifra cominciando a contare da 0.

111 = 1 * 102 + 1 * 101 * 1 * 100 Sistema decimale Nel sistema di numerazione decimale si usano i dieci simboli: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Esempio. 7408 = 7 *103

+

4 *102

+ 0 * 101

+ 8 * 100

Un qualsiasi numero reale può essere scritto nella forma polinomiale Esempio 408,73 = 4 *10

2

+ 0 * 101

+ 8 * 100

+ 7 * 10-1

+ 3 * 10-2

Sistema binario Nel sistema di numerazione binario si usano due simboli, solitamente indicati con 0 e 1. Cambiamento di base da 2 a 10. Per trasformare un numero dalla base 2 alla base 10 si scrive il numero nella forma polinomiale e si calcola il valore dell’espressione ottenuta considerando tutti i numeri come scritti in base 10. Esempio 1001

(2) = 1*23 + 0*22 + 0*21 + 1*20 = 1*8 + 0*4 + 0*2 + 1*1 = 8 + 1 = 9

Più rapidamente basta porre i pesi sopra ogni cifra a 1 e poi sommarli direttamente. Ad esempio 64 16 2 1 1 0 1 0 0 1 12 = 64 + 16 + 2 + 1 = 83 Cambiamento di base da 10 a 2. Per trasformare un numero da base 10 a base 2 si eseguono le divisioni intere successive del numero dato per 2, e dei quozienti mano a mano ottenuti sempre dividendo per 2, fino ad avere come quoziente 0: il numero scritto nella base 2 si ottiene riportando i resti delle divisioni presi in senso inverso ( dall’ultimo resto al primo ). Esempio. Convertire in base 2 il numero 55. quoziente resto 55 : 2 1 ^ 27 : 2 1 | 13 : 2 1 | 6 : 2 0 | 3 : 2 1 | 1 : 2 1 | 0 Quindi 55 = 110111(2) Cambiamento di base da 10 a 2 di un numero reale Per convertire un numero reale dobbiamo applicare due algoritmi: il primo per la parte intera in secondo per la parte frazionaria. Per la parte intera l’algoritmo è quello delle divisioni successive visto nel paragrafo precedente, per la parte frazionaria è quello delle moltiplicazioni successive che possiamo enunciare così:

3

1. si moltiplica per 2 la parte frazionaria; 2. dal risultato si toglie la parte intera e si ritorna al punto 1. L’algoritmo ha termine quando la parte frazionaria diventa 0 o si è raggiunto il numero di cifre desiderato. Esempio Convertire in base 2 il numero 0,6572

frazione prodotto parte intera

0,6572 * 2 1,3144 1 0,3144 * 2 0,6288 0 0,6288 * 2 1,2576 1 0,2576 * 2 0,5152 0 0,5152 * 2 1,0394 1

Il numero decimale 0,6572 = 0 , 101012 ottenuto prendendo le cifre della colonna parte intera. Addizione nel sistema binario. Si può applicare lo stesso algoritmo dell’addizione nel sistema decimale, occorre tenere presente che:

0 + 0 0 0 + 1 1 1 + 0 1 1 + 1 10 0 con riporto di 1

1 1 1 0 0 + 1 1 0 = -------------- 1 0 0 1 02 Sottrazione nel sistema binario. Si può applicare lo stesso algoritmo della sottrazione nel sistema decimale, occorre tenere presente che :

0 - 0 0 1 - 1 0 1 - 0 1 0 - 1 occorre ‘prendere in

prestito’ una unità della cifra di ordine superiore

Quindi 111102− 1001

2=10101

2

Moltiplicazione nel sistema binario. Si può applicare lo stesso algoritmo che si usa per il sistema decimale, tenendo presente che :

0 * 0 0 0 * 1 0 1 * 0 0 1 * 1 1

4

Esempio. 1112* 101

2 = 100011

2

Divisione nel sistema binario. Si può eseguire in modo analogo alla divisione nel sistema decimale.

Esempio. 110102 : 1012 =112

con resto 1

Il sistema binario nell’informatica

L’unità di misura “naturale” dell’informazione per l’elaboratore è il BIT , ovvero una cifra o una variabile binaria. Poiché con un solo bit è possibile rappresentare solo due elementi (associandoli ai due stati 0 e 1) dell’alfabeto esterno, per rappresentare un numero maggiore di informazioni si devono necessariamente impiegare codici binari costruiti con sequenze (ordinate) di bit. Il termine ordinato indica che, se si scambiano i valori (0 e 1) nella sequenza, si ottiene nella decodifica una informazione diversa. Una sequenza di n bit, con n numero intero, può assumere 2n configurazioni diverse e quindi rappresentare altrettante informazioni. Ad esempio con 8 bit potremo avere 28 = 256 diverse configurazioni e quindi potremo rappresentare tutti i numeri da 0 a 255. 0 00000000 1 00000001 2 00000010 3 00000011 . ……. . ……. . ……. 254 11111110 255 11111111 Essendo il singolo bit un’unità troppo piccola per rappresentare l’informazione, si introducono i concetti illustrati nella tabella seguente:

semibyte o nibble sequenza ordinata di 4 bit.

Byte o ottetto (octet) sequenza ordinata di 8 bit.

parola ( word ) sequenza ordinata di 2, 4 o 8 Byte a seconda del tipo di CPU e di

memoria centrale del calcolatore.

Nelle applicazioni, l’unità di misura bit è rappresentata con la lettera b , mentre il byte con B . Con un semibyte, ad esempio, si possono rappresentare 24 = 16 simboli elementari diversi dell’alfabeto. Attualmente, i sistemi di elaborazione devono gestire enormi quantità di informazioni codificate in binario. La memoria utilizzata per codificare una pagina di testo è di qualche migliaio di byte, quella usata per una immagine può raggiungere il milione di byte, mentre un lungo filmato può richiedere miliardi di byte per essere memorizzato. Si avverte la necessità, come nel sistema metrico decimale, di utilizzare dei simboli per rappresentare i multipli delle grandezze elementari; nella terminologia informatica sono stati quindi adottati gli stessi simboli del sistema decimale, ma visto che la misurazione della memoria ha come sua base principale il 2, il loro significato è leggermente diverso. La tabella che segue riassume i simboli e i valori dei multipli più usati:

multiplo sigla valore

5

Kilo k 210 = 1024

Mega M 220 = 10242 = 1024 k

Giga G 230 = 10243 = 1024 M

Tera T 240 = 10244 = 1024 G

Nel campo informatico, per motivi esclusivamente pratici, si preferisce rappresentare sia i numeri negativi, sia i numeri decimali utilizzando esclusivamente 0 e 1, senza cioè usare i simboli +, - né la virgola per i numeri decimali. Rappresentazione dei numeri binari con segno Per rappresentare i numeri negativi usando esclusivamente 0 e 1 si utilizzano due convenzioni, entrambe si basano sul fatto che si utilizzano un numero limitato di cifre, sempre uguale, per rappresentare i numeri. Il metodo della rappresentazione con modulo e segno consiste nell’utilizzare il primo bit per rappresentare il segno, 0 per rappresentare un numero positivo e 1 per rappresentare un numero negativo. Esempio. Utilizzando 8 bit si ha -12 = 10001100

2 +12 = 00001100

2

Questo metodo ha come svantaggio il fatto che esistono due modi per rappresentare il numero 0, precisamente 00000000 e 10000000. Complemento a 2. E’ il sistema più diffuso per rappresentare i numeri negativi in informatica. Anche in questa rappresentazione il primo bit è 0 per i numeri positivi e 1 per i numeri negativi; nel caso di numero negativo gli altri numeri si ottengono invertendo 0 con 1. Esempio. Utilizzando 8 bit si ha +12 = 000011002 -12 = 111100112

Con questo metodo il numero 0 ha un’unica rappresentazione. All’interno dei sistemi di calcolo i numeri con segno vengono rappresentati con tre formati differenti solo nel numero di bit :

formato numero bit del segno

numero bit del modulo

totale bit

word integer 1 15 16 short integer 1 31 32 long integer 1 63 64

Rappresentazione dei numeri reali. Per rappresentare i numeri decimali nel sistema binario senza usare il simbolo della virgola ma solo i simboli 0 e 1, si usano due metodi. La rappresentazione a virgola fissa si ottiene fissando il numero di bit da usare per la parte intera e quelli da utilizzare per la parte decimale. Per esempio, utilizzando 16 bit si usano i primi 8 bit per rappresentare la parte intera e gli ultimi 8 bit per rappresentare la parte decimale. Nella rappresentazione a virgola mobile ( floating point ) si fa uso della rappresentazione scientifica dei numeri. In notazione scientifica un numero num si rappresenta come num = M×bE , dove M è la mantissa, b la base del sistema di numerazione, E l’esponente. Esempio Se consideriamo -118,625 esso equivale a -11,8625 * 10 1 oppure -1,18625 * 10 2 ancora -1186,25 * 10 -1 Fra tutte le notazioni scientifiche di un numero viene utilizzata per ovvi motivi di standardizzazione quella definita dalla normativa IEEE 754 che prevede la seguente struttura:

s1.xxxxx * 2 esponente

6

s rappresenta il bit del segno della mantissa ( 0 positivo 1 negativo ), xxxxxxx sono i bit del numero e 2 è la base con il suo esponente. In sostanza si sposta la virgola ( nella notazione inglese il punto ) a destra dell’1 più significativo ( quello più a sinistra ) modificando l’esponente della base di conseguenza. Lo standard riconosce tre formati formato Numero bit del segno Numero bit della

mantissa Numero bit dell’ esponente

totale bit

singola precisione

1 23 8 32

doppia precisione 1 52 11 64 precisione estesa 1 65 15 80 La parte intera essendo sempre 1. non viene memorizzata, tranne che nella precisione estesa dove viene privilegiata la velocità del calcolo. Per rendere possibili esponenti negativi viene sommato un numero detto bias all’esponente. Questo assicura che il campo esponente contenga sempre un numero positivo. Nella tabella seguente il valore del bias per ogni precisione.

formato bias singola precisione 127 doppia precisione 1023 precisione estesa 16383

Esempio. Per rappresentare il numero -118,625 - Il segno è negativo, quindi il primo bit è 1 - 118,625(10) = 1110110,1012 scrivendolo in notazione scientifica diventa 1,110110101 * 26, - la mantissa, portata a 23 bit, è 11011010100000000000000; - All’esponente 6 occorre sommare 127 (per i numeri a precisione singola) =133 = 100001012. In definitiva il numero è

segno esponente mantissa

Sistema esadecimale Nel sistema esadecimale, abbreviato con esa o hex, si utilizzano i seguenti 16 simboli:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Che corrispondono in decimale 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15

Conversione da sistema esadecimale a decimale. Si scrive il numero in forma polinomiale e si eseguono le operazioni, il numero ottenuto è in forma decimale.

Esempio.

AF316 = A*162 + F*161 + 3*160 = 10*256 + 15*16 + 3*1 = 2560 + 240 + 3 = 2803

Conversione da decimale a esadecimale. Si divide il numero per 16 ripetutamente fino a ottenere quoziente 0, quindi si riportano i resti in ordine inverso. Esempio. Convertire 1204 nel sistema esadecimale quoziente resto 1204 : 16 = 75 4 = 416;

7

75 : 16 = 4 11= B16; 4 : 16 = 0 4 = 416; 0 poiché il quoziente è 0 si interrompe la divisione. Quindi 1204 = 4B416

Conversione di un numero dalla base 2 alla base 16 L’algoritmo è : • dividere il numero binario in gruppi di 4 cifre partendo da destra verso sinistra • sostituire ad ogni gruppo la corrispondente cifra esadecimale Esempio. Convertire 10001111102 nel sistema esadecimale

10 0011 11102 2 3 14 = E16

Quindi 10001111102 = 23E16 Conversione di un numero dalla base 16 alla base 2 Basta sostituire ad ogni cifra esadecimale il corrispondente valore binario a 4 bit Esempio. Convertire 3FD16 in base 2 3 F D 0011 1111 1101 Quindi 3FD16 = 0011 1111 1101

8

Teoria dei sistemi

Definizione di sistema Innanzitutto proponiamo una definizione di sistema, che riteniamo abbastanza semplice, comprensibile e generale. Un sistema è un insieme di oggetti o sottosistemi che interagiscono tra di loro e scambiano energia, informazioni o materia con l’ambiente esterno allo scopo di raggiungere un obiettivo prefissato. La definizione è sicuramente generale, ma non per questo generica: Un sistema è un insieme di ... queste parole hanno un preciso significato operativo,infatti dicono che, nello studio di un sistema, è possibile e conveniente scomporre lo stesso in una serie di sottoinsiemi, che risulteranno sicuramente più semplici;... che interagiscono tra di loro…. sottolinea il fatto che le singole parti non vivono separatamente all’interno del sistema,bensì sono fortemente correlate le une con le altre e tutte, direttamente o indirettamente, con il mondo esterno.

Come riconoscere un sistema Per riuscire a rappresentare non soltanto un unico sistema, ma un’intera categoria di sistemi risulta essenziale quindi considerare i seguenti aspetti: • la funzione svolta dal sistema; • l’insieme degli elementi che costituiscono il sistema; • le interazioni che il sistema ha con il mondo esterno; • le relazioni esistenti tra i vari elementi costitutivi del sistema. Esempi

• Un esempio di sistema è l’automobile che può essere considerata tale, in quanto aggregato di entità fisiche, quali componenti meccanici ed elettrici, in relazione tra loro, che cooperano per il raggiungimento di uno scopo funzionale. • Viene considerata come altro esempio di sistema l’algebra dei polinomi, anch’essa insieme di entità concettuali correlate tra loro da insiemi di regole. • Un terzo esempio di sistema è il corpo umano, costituito da una serie di componenti, (in questo caso organi), anch’essi in relazione tra loro per arrivare ad uno stesso scopo funzionale. Classificazione dei sistemi Rispetto alla natura possiamo distinguere:

• sistemi naturali: sono quelli che esistono in natura. Per esempio il sistema solare, un albero ecc. • sistemi artificiali: sono creati dall’uomo per soddisfare certe sue esigenze. Esempi di sistemi artificiali sono: l’ automobile, sistema di distribuzione dell’energia elettrica, il sistema giudiziario, quello bancario ecc. ecc… • sistemi misti: sono ottenuti combinando cose che già esistono in natura con altre organizzate ad hoc. Ad esempio, la serra in cui ci sono le piante che già esistono in natura.. Rispetto al comportamento si possono distinguere:

• sistemi aperti: sono quei sistemi che scambiano qualcosa con l’ambiente, dove con ambiente si intende tutto ciò che non fa parte del sistema; ad esempio un elettrodomestico che ha bisogno dell’energia elettrica per funzionare. • sistema chiuso: non scambia niente con l’ambiente. A una prima analisi potremmo definire un sistema chiuso un’autovettura, oppure una radiolina a batterie. In realtà la radiolina diffonde suono e l’automobile

9

disperde gas di scarico; questo fa capire che di fatto non esistono sistemi assolutamente chiusi. Anche qui però, per illustrare meglio il concetto di soggettività delle scelte, notiamo che se l’interesse dello studio di una radiolina portatile è rivolto al problema dell’alimentazione, è lecito considerare la radiolina come sistema chiuso. In ogni caso si può affermare che in un sistema chiuso l’intervento dell’ambiente esterno è secondario rispetto allo scopo per cui si studia il sistema. • sistema deterministico: è quel sistema il cui comportamento è inequivocabilmente noto, una volta definita la sollecitazione alla quale lo si sottopone. Per esempio nel caso della lampada, sappiamo tutti che posizionando l’interruttore su “on” si accende la lampadina. • sistema probabilistico: è quel sistema per il quale non è individuabile una corrispondenza univoca tra sollecitazione e comportamento. Basti pensare alla roulette: in via del tutto teorica, al lancio della pallina dovrebbe corrispondere un risultato completamente casuale. • sistema continuo: è un sistema la cui condizione in un certo istante di tempo è comunque diversa da quella nell’istante precedente, per quanto piccolo possa essere l’intervallo che separa questi due istanti. Un esempio di sistema continuo può essere un’autovettura che viaggia su una strada; se la condizione di questa macchina è definita dalla posizione occupata in un certo istante di tempo, possiamo dire che essa varia con continuità. • sistema discreto: è quello che può trovarsi solo in un numero finito di condizioni, ben diverse l’una dall’altra, che rimangono stabili per un certo intervallo di tempo, fintantoché non arriva un’altra sollecitazione. Un esempio di sistema discreto è la lampada la quale può trovarsi in una e solo una delle due condizioni consentite: accesa o spenta. • sistemi statici: sono quelli la cui condizione rimane almeno apparentemente invariata nel tempo. Ad esempio, rispetto a eventuali spostamenti, i continenti costituiscono un sistema statico, su intervalli di tempo dell’ordine di grandezza della durata di una vita umana. • sistemi dinamici: sono quelli la cui condizione varia percettibilmente durante il periodo di osservazione. Tenuto conto che esiste la deriva dei continenti dobbiamo riconoscere che probabilmente non esistono sistemi statici. In questo caso la soggettività della scelta di considerare i continenti statici o dinamici dipende dalla scala dei tempi adottata nel nostro studio. • sistemi stazionari o invarianti nel tempo: ad una certa sollecitazione il sistema risponde sempre nello stesso modo, a prescindere dall’istante di tempo in cui tale sollecitazione è applicata. Come esempio ripensiamo ancora al sistema lampada. • sistema istantaneo o combinatorio: è un sistema il cui comportamento in risposta ad una certa sollecitazione non dipende dalla condizione del sistema stesso al momento della sollecitazione. • sistema propriamente dinamico, o sequenziale: è un sistema il cui comportamento in risposta ad una particolare sollecitazione è determinato dalla condizione in cui si trova al momento stesso della sollecitazione. Sistema di illuminazione di una stanza La stanza è formata da un ingresso e da due zone laterali distinte. Per una corretta illuminazione sono previste 3 lampade, una per la zona centrale dell’ingresso (L2),una per il lato sinistro (L1) e una per il lato destro (L3).L’accensione dei 3 punti luce è regolata da due pulsanti P1 e P2 posti ai lati dell’unicaporta di accesso, in base ai seguenti criteri:

1. Entrando nella stanza per la prima volta e premendo un pulsante, sia esso P1 o P2, si accende la lampada L2 dell’ingresso.

2. Premendo ulteriormente un pulsante, la lampada L2 si spegne e si accende una delle lampade rimanenti: L1 se si è premuto il pulsante P1, L3 se si è premuto il pulsante P2.

3. La pressione ulteriore di uno qualsiasi dei pulsanti indica che si sta uscendo dalla stanza e spegnerà la luce accesa, qualunque essa sia.

L1 P1

L3 P2 L2

10

Condizioni di funzionamento: I pulsanti P1 e P2 non possono essere premuti contemporaneamente. Le lampade possono essere accese una alla volta, cioè non possono mai essere accese più di una lampada per volta.

Identificazione: Ingressi: P1 e P2 Uscite: L1, L2, L3 . valori assunti dagli ingressi: (0,0); (1,0); (0,1) dove 0 = non premuto e 1 = premuto valori assunti dalle uscite:( 0,0,0); (0,1,0); (1,0,0); (0,0,1) dove 0 = spenta e 1 = accesa Stati: S0 = buio; S1 = luce_ingresso; S2 = luce_sinistra; S3 = luce_destra Tabella di transizione degli stati Tabella di trasformazione delle uscite Ingressi

Stati 0,0 1,0 0,1 stati USCITE

S0 S0 S1 S1 S0 000

S1 S1 S2 S3 S1 010

S2 S2 S0 S0 S2 100

S3 S3 S0 S0 S3 001

Modelli Definizione di modello Il modello è una rappresentazione semplificata di un sistema fisico, allo scopo di rendere più semplice lo studio e l’analisi delle sue caratteristiche più significative, in relazione al contesto in cui opera. Classificazione dei modelli Una possibile classificazione dei modelli può essere fatta rispetto all’uso, nel senso ormai chiaro che la rappresentazione di una particolare realtà può essere diversa a seconda delle finalità per cui è prodotta. In base all’uso i modelli si classificano in: Modelli descrittivi o statici: sono quelli che si limitano a riprodurre con eventuali semplificazioni la realtà, senza presupporre l’uso che ne verrà fatto. Ad esempio un modello descrittivo di una lavatrice è la sua fotografia che la riproduce nel suo insieme. Modelli predittivi: sono quei modelli che di una certa realtà danno gli elementi necessari per prevederne l’evoluzione, lasciando spazio ad eventuali scelte. Un modello predittivo è quello che descrive i possibili programmi di lavaggio. Modelli prescrittivi: sono quei modelli che impongono un comportamento particolare in previsione dell’obbiettivo da raggiungere. Un modello prescrittivo è la sequenza di comandi che si devono dare se si vuole ottenere un particolare risultato. Rispetto alla natura possiamo classificare i modelli in:

11

Modelli in scala è una riproduzione del sistema in cui una o più grandezze originali sono state modificate proporzionalmente; esso riproduce quindi fedelmente l'aspetto fisico del sistema con eventuali riduzioni di scala (ad esempio plastici, modellini di auto, fotografie). Modelli analogici I modelli analogici riproducono i sistemi originali con grandezze fisiche di natura diversa, ma correlate da relazioni simili a quelle valide per il sistema originale e, soprattutto, molto più facili da trattare. Tale modello si chiama analogico in quanto sfrutta le analogie tra sistemi di natura diversa (isomorfismi), ma con comportamenti analoghi. Uno degli ambiti in cui il ricorso ad analogie è molto frequente è quello dello studio di sistemi meccanici, troppo complessi e costosi per poter valutarne il comportamento direttamente sui prototipi. Lo studio di un sistema meccanico viene condotto utilizzando circuiti elettrici con comportamento analogo, molto meno costosi ed ingombranti. Un altro esempio di modello analogico è il simulatore di volo. Modelli matematici: in cui il sistema viene rappresentato dalle funzioni matematiche che lo regolano; Modelli grafici: rappresentano su carta con particolari simbologie il sistema in oggetto (ad esempio la rappresentazione mediante tabelle delle funzioni di transizione e di trasformazione); Modelli logici: insieme di regole logico-funzionali che permettono di simulare il comportamento del sistema originale ( algoritmi di simulazione ). Supponendo di conoscere qual è il peso da sollevare, poniamoci il problema di calcolare la forza da applicare; a tale scopo utilizziamo la formula fisica che esprime il funzionamento della leva mediante l’uguaglianza di due prodotti: forza applicata per il braccio e forza peso per il Modelli grafi: Costituti da cerchi che rappresentano gli stati del sistema modellato e da archi che rappresentano le transazioni da uno stato ad un altro.

MODELLI

FISICI

ASTRATTI

IN SCALA

ANALOGICI

MATEMATICI

LOGICI

GRAFICI

GRAFI

A BLOCCHI

12

Modelli a blocchi: Si scompone il sistema modellato in sottosistemi rappresentati da blocchi e forniti di ingressi e uscite generalmente rappresentati con frecce.

La metodologia da usare per rappresentare un sistema secondo un modello a blocchi consiste nell’ identificazione del sistema cioè • isolare le parti del sistema che interessano lo studio • individuare le grandezze che influenzano direttamente il comportamento del sistema ( ingressi o variabili indipendenti ) • individuare le grandezze che influenzano indirettamente il comportamento del sistema (uscite o variabili dipendenti ) • individuare le grandezze che non sono controllabili ne direttamente ne indirettamente e che influenzano il comportamento del sistema ( disturbi ) • individuare le grandezze che restano costanti durante il periodo di osservazione del sistema Dopo la fase di identificazione del sistema bisognerà • Definire la scala dei tempi di osservazione di un sistema • Definire le relazioni tra uscite ed ingressi • Costruzione di un grafico Sistemi dinamici deterministici (SDD) A questa categoria può essere ricondotto l’esame di un numero molto elevato di sistemi reali Definizione Un sistema dinamico è un insieme di elementi correlati tra loro che concorrono nello stabilire una ben precisa relazione tra sollecitazioni esterne ( ingressi ) e conseguenti reazioni ( uscite ) Nello studio di un sistema venno individuali i seguenti insiemi: 1 Un insieme ordinato di tempi T. 2 Un Insieme I delle n variabili di ingresso 3 Un insieme VI di tutti le n-ple ordinate dei valori degli ingressi. 4 Un insieme U di tutti i m variabili di uscita. 5 Un insieme VU di tutti le m-ple ordinate dei valori delle uscite. 6 Un insieme S di tutti i valori degli stati. E le seguenti funzioni 7 Una funzione g di trasformazione delle uscite.

u(t) = g ( t, s ( t ) , i( t ) ) la funzione ci consente di “prevedere” quale sarà il valore dell’uscita ad un certo istante t, conosciuti lo stato s e i valori degli ingressi i allo stesso istante t. 8 Una funzione f di transizione degli stati

s (t1) = f ( t1, to, s(t0), i(t) [t0 t1[ ) la funzione ci consente di “prevedere” quale sarà il valore dello stato s ad un certo istante t1, conosciuti

ingressi

uscite

disturbi

parametri

13

lo stato s ad un istante di tempo “precedente” t0 e i valori assunti dagli ingressi nell’intervallo di tempo da t0 a t1. La simulazione Definizione : Simulare significa studiare il comportamento di un sistema a seguito di sollecitazioni a cui è sottoposto, utilizzando un opportuno modello. Il medodo di simulazione che ci interessa è quello basato sull’uso del calcolatore. Ogni programma di simulazione deve contenere i seguenti aspetti: 1 Inizializzazione delle variabili di stato. 2 Ciclo iterativo di simulazione. 3 Acquisizione dei valori. 4 Produzione dei tabulati finali. 1. Blocco di inizializzazione (stato iniziale).

• Acquisizione dei valori dei parametri del sistema. • Acquisizione dei valori dei parametri relativi alla scansione temporale della simulazione e la

dimensione dell’intervallo Δt intercorrente tra due osservazioni successive. • Acquisizione o determinazione dei valori delle variabili di stato all’istante iniziale.

2. Ciclo di simulazione (per ogni valore di t). • Determinazione del valore di ogni variabile d’ingresso. • Calcolo del valore di tutte le variabili di uscita. • Visualizzazione dei risultati al tempo t. • Calcolo, tramite la funzione di transizione, dello stato all’istante successivo.

3. Acquisizione dei valori • Inserimento direttamente da tastiera (lento). • Utilizzo di una tabella precostituita. • Acquisizione diretta da un file.�Utilizzo di una funzione.

4. Uscite • Visualizzazione dei valori ottenuti su video o su stampante. • File sequenziale di uscita. • Grafico su video o su plotter.

L’unità di tempo deve essere calibrata tenendo conto del problema in esame. Comportamento di un sistema dinamico deterministico L’evoluzione nel tempo di un sistema reale avviene attraverso scambi di energia, sia con il mondo esterno, sia tra gli elementi che lo compongono. • Le variabili di ingresso rappresentano la capacità del sistema di acquisire energia dall’esterno. • Le variabile di stato rappresentano la capacità del sistema di accumulare energia al suo interno. • Le variabile di uscita rappresentano la capacità del sistema di cedere energia all’esterno. Stato zero L’energia interna del sistema è nulla. La risposta avviene a spese dell’energia fornita dall’esterno tramite gli ingressi ( risposta a stato zero o risposta forzata ).

Stato a ingresso zero Il sistema risponde solo a spese dell’energia interna ( ingressi nulli ). ( risposta a ingresso zero o risposta libera ).

La risposta completa (reale) sarà ottenuta attraverso una combinazione delle due risposte forzata e libera.

14

Esempio Batteria scarica (stato zero). Il sistema evolve solo a spese dell’energia ricevuta dall’esterno (ingresso).Batteria carica con macchina spenta e fari accessi (stato a ingresso zero). Il sistema continua a cedere energia all’esterno diminuendo la propria carica.L’alternatore fornisce energia. Il sistema accumula energia durante il normale funzionamento. La risposta è una combinazione della risposta forzata e della risposta libera.

Stati di regime e stati di transitorio Una lampada al neon risponde alla variazione di energia solo dopo un certo tempo.Questo comportamento, che è una caratteristica strutturale del sistema e non dipendedagli ingressi, individua un parametro temporale T, detto costante di tempo, legato allavelocità di risposta del sistema alla variazione delle sollecitazioni esterne.Si può dimostrare che in tutti i sistemi di questo tipo le uscite, pur dipendendo in modoistantaneo dallo stato e dagli ingressi, richiedono lo stesso intervallo di tempo (pari a 5costanti di tempo T) per raggiungere il valore atteso.Stati di regime: uscita stabilizzata detta uscita di regime.Stati di transitorio: uscita di transitorio che varia fino a stabilizzarsi intorno all’uscita diregime.Il comportamento in transitorio può essere rilevato se il sistema viene osservato con unascansione temporale inferiore alla costante di tempo T.

Controllo automatico Gli SDD vanno spesso controllati, cioè vanno svolte una serie di azioni che hanno come fine la realizzazione ed il mantenimento di uno specifico comportamento del sistema., utilizzando un sistema detto controllo.

Regolazione Un sistema di controllo è detto regolatore quando il valore di ingresso funge da riferimento ed è costante nel tempo ( o comunque variabile solo per impostare un nuovo riferimento ); La sua funzione è quella di mantenere l’uscita ad un valore costante, pari a quello fissato tramite la grandezza di riferimento. Ad esempio quando si vuole mantenere la temperatura di un appartamento ad una temperatura determinata. Servosistema Si ha un servosistema quando le grandezze di riferimento variano nel tempo ed il controllo in questo caso ha lo scopo di far seguire alle uscite l’andamento delle grandezze di riferimento. L’esempio è quello di un missile da crociera, che preleva come riferimento il profilo del terreno e varia la sua quota di conseguenza. Retroazione Come abbiamo visto nel controllo automaticop una parte del segnale in uscita ( segnale di retroazione ) viene sommata o sottratta al segnale di ingresso generando l’effettivo segnale ( errore ) di riferimento. Se il segnale è sottratto si parla di retroazione negativa, che tende a eliminare l’eerore di uscita. L’effetto di questo tipo di retroazione è la stabilizzazione del sistema. Se il segnale di retroazione viene sommato , si ha la retroazione positiva, che tende ad esaltare l’ingresso, che già produce errore. In generale la

controllo

Forno a microonde tempo temperatura

suono campanello grado di cottura

15

retroazione va evitata. Un sistema retoazionato si rappresenta con il seguente modello schema a blocchi:

dove r = segnale di riferimento e = r +/- c errore c = grandezza controllata u = uscita Caratteristiche della risposta di un sistema Gli ingressi di un sistema possono essere sottoposti a tre diversi tipi di sollecitazione: sollecitazione a gradino : l’ingresso viene portato istantaneamente al valore desiderato

sollecitazione a rampa lineare: l’ingresso viene portato a velocità costante al valore desiderato

sollecitazione a rampa parabolica : l’ingresso viene portato con accelerazione costante al valore desiderato

controllo

sistema r

u

+/-

e

c

t

t

t

16

L’uscita del sistema potrà rispondere ad una sollecitazione degli ingressi in tre modi diversi: con un andamento esponenziale

con un andamento smorzato

con un andamento oscillatorio

La risposta di un sistema a una sollecitazione e caratterizzata dalle seguenti proprietà:- - precisione - velocità di risposta - stabilità Precisione Parlare di precisione significa considerare gli errori compiuti dal sistema. Definizione : L’errore assoluto è la differenza tra valore atteso dell’uscita Ua e valore effettivo Ueff ottenuto cioè:

Ea = | Ua - Ueff |

Facciamo un esempio Ea = 1000 – 999 = 1 Ea = 10 – 9 = 1 in entrambi i casi l’errore assoluto è 1 , ma è evidente che le grandezze in gioco sono nettamente differenti. Si preferisce allora fare riferimento all’errore relativo definito come:

t

Ua

t

Ua

t

Ua

17

Er = Ea \ Ua

Nell’esempio precedente Er = 1/1000 Er = 1/10 nel primo caso l’errore è meno influente dato l’ordine di grandezza del valore atteso. Velocità di risposta La velocità di risposta viene espressa da tre grandezze: tempo di ritardo Per tempo di ritardo Tr si intende il tempo impiegato dal sistema per portare l’uscita dal valore 0 alla metà del valore atteso Ua / 2. tempo di salita Per tempo di salita Ts si intende il tempo impiegato dal sistema per portare l’uscita dal 10% al 90% del valore atteso Ua. tempo di assestamento Per tempo di assestamento Ta si intende il tempo impiegato dal sistema per portare l’uscita a stabilizzarsi in una fascia di tolleranza del + o – 2% del valore atteso Ua. Stabilità La stabilità si può definire intuitivamente come la caratteristica di un sistema nel quale l’uscita, valutata dopo il tempo di assestamento si mantiene costante e limitata nel tempo. Riassumendo si può anche dire che controllare un sistema significa far si che la precisione, la stabilità e la velocità di risposta siano quelle desiderate.

AUTOMI

Normalmente il termine automa è associato all’altro ancor più generale di macchina e sta ad indicare un congegno che «imita i movimenti e le funzioni di un corpo animato». In sostanza il concetto di automa è quello di una macchina capace di svolgere in maniera automatica, una volta sollecitata in modo opportuno, delle operazioni particolari più o meno complesse che portano a un preciso risultato. Come si vede l’automa non è altro che un particolare sistema e per esso possono essere usate tutte le rappresentazioni simboliche e formali definite per un generico sistema.

Teoria degli automi La teoria degli automi (o teoria degli automi finiti o teoria delle macchine a stati finiti o teoria delle macchine sequenziali), è uno dei più importanti settori della teoria generale dei sistemi. Sorta verso il 1950 essa ebbe subito un grande sviluppo. In essa si possono distinguere la teoria degli automi a stati finiti.

Un automa a stati finiti è un sistema dinamico, invariante, discreto le cui funzioni di trasformazione e transizione sono funzioni discrete e i cui insiemi VI e VU sono finiti Quindi l’automa come sistema è anch’esso caratterizzato da: 1. L’ insieme ordinato dei tempi T 2. un insieme finito di possibili ingressi I; 3. un insieme finito dei possibili valori assunti dagli ingressi VI

18

4. un insieme finito di possibili uscite U; 5. un insieme finito dei possibili valori assunti dalle uscite VU 6. un insieme finito di stati S; 7. Una funzione g di trasformazione delle uscite.

u(t) = g ( s ( t ) , i( t ) ) la funzione ci consente di “prevedere” quale sarà il valore dell’uscita ad un certo istante t, conosciuti lo stato s e i valori degli ingressi i allo stesso istante t.

8. Una funzione f di transizione degli stati

s (t1) = f ( s(t0), i(t0) ) la funzione ci consente di “prevedere” quale sarà il valore dello stato s ad un certo istante t1, conosciuti lo stato s e l’ingresso i ad un istante di tempo “precedente” t0. Esempi di automi un ascensore serve una casa a due piani accettando la richiesta del piano dove si vuole andare (Terra, 1, 2) e dando in uscita lo spostamento dell’ascensore (Su, Giù, Fermo). • L’automa è dinamico, discreto, invariante (con l’insieme degli ingressi e delle uscite finiti). • L’insieme degli ingressi I = { pulsante } • L’insieme dei valori che possono assumere gli ingressi VI = { T, 1, 2 } • L’insieme delle uscite U = { spostamento } • L’insieme dei valori che possono assumere le uscite VU = ( Su, Giù, Fermo ) • L’insieme degli stati S = { Pt, 1P, 2P } • La funzione f (funzione di transizione dello stato successivo) • La funzione g (funzione di trasformazione delle uscite) Esistono due modi per rappresentare le funzioni f e g 1. Tabelle di transizione 2. Grafi (o diagrammi) di transizione Tabelle di transizione Nelle tabelle il numero delle righe è identificato dal numero degli stati mentre per le colonne si utilizzano i valori che possono assumere gli ingressi (VI).

S / VI T 1 2

Pt Pt / Fermo 1P / Su 2P / Su

1P Pt / Giù 1P / Fermo 2P / Su

2P Pt / Giù 1P / Giù 2P / Fermo

Grafi di transizione

19

I grafi di transizione sono identificati da tanti cerchi (chiamati nodi) quanti sono il numero degli stati; da ogni nodo partono tanti archi quanti sono gli ingressi. Esistono poi due tipi di rappresentazione:

1. Automa MEALY (le uscite sono riportate sugli archi sotto gli ingressi) 2. Automa MOORE (le uscite sono riportate all’interno dei nodi sotto lo stato)

Applicazioni degli automi Un esempio di applicazione può essere attribuito a quel dispositivo elettromeccanico automatico e programmabile, usato nell’industria e nella ricerca scientifica per svolgere un compito o un repertorio limitato di compiti comunemente detto robot. L’idea di robot risale a tempi antichi, quando alcuni miti raccontavano di creature meccaniche portate alla vita. Simili automi furono realizzati nel carillon di diverse chiese medievali, mentre nel XVIII secolo alcuni orologiai divennero famosi per aver prodotto manichini semoventi ingegnosi e complessi. Oggi il termine automa è applicato, nel linguaggio comune, ai dispositivi artigianali di solito più meccanici che elettromeccanici, realizzati per imitare i movimenti di esseri viventi. Alcuni dei robot utilizzati per il cinema o a scopo di intrattenimento sono in realtà automi, magari con l’aggiunta di sistemi di telecomando.

20

Esempio

L'automa e' l'obliteratrice di biglietti di un bus di città ( accetta un nuovo biglietto solo quando il precedente e' stato estratto). Viene inserito il biglietto per cui il sensore lo “sente” e va in on e viene quindi timbrato il biglietto

I = ( sensore ) VI = ( on, off ) U = ( timbro ) VU = ( si, no ) S = ( attesaBiglietto, attesaEstrazione )

VI S

on off

attesaBiglietto

attesaEstrazione

si

attesaBiglietto

no

attesaEstrazione

attesaEstrazione

no

attesaBiglietto

no

attesaEstrazione attesaBiglietto

on / si

off / no

off / no on / no

sensore

timbro

21

Esempio L’automa è una doccia a pagamento che inserita una moneta da 20 centesimi “apre” il rubinetto dell’acqua per 1 minuto.

I = ( moneta, timer ) VI = ( ( 20, off ), ( 0, on ), ( 0, off ) , (20, on)) U = ( acqua ) VU = ( si, no ) S = ( aperta, chiusa )

VI S

20, off 0, on 0, off 20, on

aperta

chiusa

aperta chiusa

(20, on) / si

(0, off) / no

(0, off) / no (0, on) / si

moneta timer

acqua

22

Comunicazioni Modello di un processo di comunicazione La comunicazione può essere definita come il procedimento per trasmettere e ricevere messaggi. Gli elementi della comunicazione sono quindi la sorgente fonte del messaggio, il destinatario che riceve il messaggio ed il canale, cioè il mezzo attraverso cui il messaggio passa dalla sorgente al destinatario.

messaggio

Il processo di comunicazione può essere sincrono, se la sorgente ed il destinatario utilizzano lo stesso clock per la trasmissione, asincrona se sorgente e destinatario non hanno un orologio comune per cui i messaggi sono preceduti da caratteri di controllo che servono alla sincronizzazione del trasmettitore e del ricevitore. La comunicazione si divide anche nei tipi: Unicast: c’è solo un destinatario Multicast: i destinatari sono un gruppo specifico ( televisione a pagamento ) Broadcast : i destinatari sono tutti ( televisione ) Per messaggio intendiamo il fatto o la notizia, che ha un significato oggettivo per informazione ciò che ha un valore soggettivo. Per meglio comprendere un processo di comunicazione, possiamo usufruire del modello di Shannon:

Sorgente Fonte del messaggio CS Codifica di sorgente : si sceglie un codice e si codifica il messaggio, dalla parte del destinatario vi è la DS ( decodifica di sorgente ) che opera il processo inverso. CC Codifica di canale : Il messaggio viene inviato con ridondanza, ovvero, vengono aggiunti dei bit al messaggio, per consentire al destinatario di rilevare ed eventualmente correggere errori, dalla parte del destinatario vi è la DC ( decodifica di canale ) che opera il processo inverso. CL Codifica di linea Il messaggio per essere inviato deve passare da una forma simbolica ad una forma di segnale elettrico per adattarlo al tipo di canale, dalla parte del destinatario vi è la DL ( decodifica di linea ) che opera il processo inverso. TX Trasmettitore Il trasmettitore manderà il messaggio sul canale . Canale Il messaggio arrivato sul canale potrebbe incontrare del noise, cioè rumore che può alterare il significato del messaggio . RX Ricevitore : Il messaggio arriva al ricevitore. DL Decodifica di linea Il messaggio è ritrasformato da segnale elettronico a messaggio in simboli. DC Decodifica del canale Viene controllata la ridondanza inviata nel messaggio, per non verificare l’esistenza di eventuali errori. DS Decodifica del messaggio Il messaggio viene decodificato. Destinatario Riceve il messaggio . Rumore In un sistema di comunicazione insieme al segnale utile è presente anche un segnale completamente privo di informazione e che influisce sulla corretta ricezione del messaggio. Parleremo di

sorgente

destinatario canale

23

rumore generato dagli stessi apparati elettronici impiegati per la trasmissione; è sempre presente ; disturbo del tutto casuale determinato da vari fattori quali onde elettromagnetiche provenienti da eventi naturali (ad esempio i fulmini) o artificiali quali accensioni di motori, interferenze fra circuiti ecc. ecc.. Codici alfabeto è l’insieme dei simboli con i quali si costruiscono le parole parola è l’oggetto formato da una sequenza di uno o più simboli appartenenti ad un alfabeto L’insieme X delle parole è definito codice. Per costruire un codice bisogna prima • definire il numero dei simboli dell’alfabeto e • la lunghezza delle parole. Se abbiamo un alfabeto di S simboli e lunghezza di paola n avremo S n parole diverse tra loro. Ad esempio S = 2 n = 8 avremo 28 = 256 parole diverse fra loro. Ogni codice ha una sua lunghezza minima di parola cioè il numero minimo di simboli che devono avere tutte le parole per non codificare in un modo ambiguo gli elementi; questa lunghezza non deve essere superata. Se è uguale si avrà un codice efficiente cioè che la sua lunghezza di parola è uguale alla lunghezza minima, se si supera si avrà un codice ridondante cioè che la sua lunghezza di parola è maggiore della lunghezza minima di parola. I codici possono codificare solo numeri ed in questo caso avremo codici efficienti numerici e codici che possono codificare simboli di vario genere ( lettere, cifre, segni di interpunzione ecc.. ecc.. ) detti codici efficienti alfanumerici. Codici efficienti numerici Esempi di codici efficienti numerici sono: • Il codice BCD con S = 2 e L = 4 quindi potremo codificare 24 = 16 parole diverse • Codice Eccesso 3 con S = 2 e L = 4 Il codice BCD è un codice efficiente e ponderato, efficiente perché per codificare le 10 cifre decimali utilizza 4 bit ossia una lunghezza uguale a quella minima; ponderato perché ogni bit ha un valore in base alla sua posizione, per questo motivo il codice viene anche chiamato codice 8421 cioè il valore decimale delle potenze di 2 partendo dal bit più significativo a quello meno significativo. Tabella del BCD

Decimale BCD

0 0000

1 0001

2 0010

3 0011

4 0100

5 0101

6 0110

7 0111

24

8 1000

9 1001

Il codice eccesso 3 è un codice numerico efficiente che codifica le cifre decimali su 4 bit. Ed è un codice non ponderato, ma autocomplementante, cioè per ottenere il complemento a 9 di una cifra basta invertire i bit corrispondenti. Il suo nome deriva dal fatto che ogni codifica è ottenuta dalla corrispondente configurazione binaria sommata a 3.

Tabella codice eccesso 3

decimale eccesso 3

0 0011

1 0100

2 0101

3 0110

4 0111

5 1000

6 1001

7 1010

8 1011

9 1100

Da notare che per i due codici esaminati delle 16 possibili parole se ne utilizzano 10 soltanto, cioè il numero delle cifre del sistema numerico decimale. Codici efficienti alfanumerici Quando in un processo di comunicazione l’oggetto è un testo costruito non solo da cifre ma anche da caratteri alfabetici e caratteri speciali, occorre utilizzare i codici alfanumerici, ovviamente questi codici hanno lunghezza di parola maggiore di 4. Esempi di codici efficienti alfanumerici sono:

codice S = numero simboli

L= lunghezza parola numero parole

Codice ASCII 2 7 o 8 27 =128 o 28 = 256

Codice EBCDIC 2 8 28 = 256

Codice ISO-8859 2 8 28 = 256

Codice Unicode 2 16 216 = 65536 Il codice ASCII è quello dei codici alfanumerici più usato e può rappresentare un vasto numero di caratteri, rendendo più agevole la codifica dei dati di varia natura.

25

Il codice ASCII nella versione standard è un codice a 7 bit con il quale si possono codificare 128 simboli (oppure se lo si vuole estendere ad 8 bit può codificare 256 simboli) diversi. Esso è formato da due diverse categorie: i caratteri riproducibili (cioè se digitiamo sulla tastiera le parole si vedono i suoi effetti) ed i non riproducibili (cioè se digitiamo sulla tastiera, per esempio, "invio" non si vedrà nulla tranne il movimento del cursore nella riga successiva). Il codice EBCDIC Un altro codice a 8 bit utilizzato è il codice EBCDIC sviluppato da IBM per i propri sistemi di grandi dimensioni;poiché è utilizzato solo dai sistemi IBM,questo codice rende incompatibili le macchine IBM con sistemi appartenenti ad altri produttori. Ogni byte comprende due parti(semibyte o nibble) di quattro bit: Il semibyte più significativo è detto Zonatura Il semibyte meno significativo è detto Numerico I caratteri alfanumerici contigui sono raggruppati in blocchi: Quattro blocchi principali(le prime 4 zone) da 0000 0000 a 0011 1111 che sono riservati hai caratteri di controllo I blocchi da 0100 0000 a 1011 1111 sono per le lettere minuscole I blocchi da 1100 0000 a 1111 1111 sono utilizzate per le lettere maiuscole e per le cifre numeriche;mentre i per i numeri i bit di zonatura sono 1111. Il codice ISO 8859 è una famiglia di 14 diversi codici ognuno dei quali ha un repertorio di 256 caratteri. Il set dei caratteri comprende gli alfabeti di quasi tutte le lingue del mondo; infatti lui identifica con ISO 8859-n (per n sta il numero che scegliamo per la lingua[per ogni lingua sta un numero]). Il codice Unicode è un sistema per scambiare , elaborare e visualizzare testo scritto nelle diverse lingue nel mondo moderno;questo codice a confronto del resto include 34168 caratteri supportate da 24 lingue diverse, tra le principali nel mondo. Codici ridondanti Lo schema del modello di comunicazione comprende la codifica di sorgente, che consiste nel codificare il messaggio in modo tale da permettere a chi lo riceve di stabilire se il messaggio è corretto o errato. Per fare questo si usano i codici ridondanti, cioè codici che hanno una lunghezza di parola superiore alla lunghezza minima. Quindi se servono n bit per codificare un messaggio in modo efficiente, si deve utilizzare un codice con lunghezze di parole m > n + k i k bit aggiuntivi sono detti bit di controllo. La lunghezza delle parole del codice diventa m = n + k dove n è la lunghezza della parola e k i bit aggiuntivi. Si definisce ridondanza R il valore ottenuto dalle seguente formula:

m n + k k

R = ____ = _____ = 1 + ___ n n n

Pertanto più grande è k e più tempo si impiega a trasmettere il messaggio. I k bit di controllo non sono disposti in modo causale, ma secondo uno schema preciso che permetta al destinatario di controllare la correttezza del messaggio ricevuto.

Peso: il peso di una parola è il numero di bit 1 presenti nella parola stessa.

Distanza tra due parole: Numero di posizioni in cui le parole hanno bit con valore diverso. Per esempio, se P1 = 10001 e P2 = 10110, le due parole hanno distanza = 3.

26

Molteplicità dell’errore: Distanza tra la parola trasmessa e la parola ricevuta. Per esempio, si ha errore di molteplicità 2 quando ci sono 2 bit sbagliati nella parola ricevuta.

Distanza minima di hamming di un codice: La distanza minima di hamming è la minima distanza tra una qualsiasi coppia di parole di un codice ( si indica con h ). Si può affermare che i codici efficienti hanno h = 1 e quelli ridondanti h > 1. Più elevato è h , maggiore è la probabilità di rivelare una parola errata, perché il codice è in grado di rilevare parole errate con molteplicità dell’errore fino a h-1. Un codice in grado di rilevare l’errore non è detto che sia anche in grado di correggerlo: per questo motivo i codici ridondanti si distinguono in codici rilevatori e codici correttori di errori. I codici rilevatori richiedono meno bit di controllo rispetto ai codici correttori: quindi nel primo caso la comunicazione è più efficiente rispetto al secondo caso. In un processo di comunicazione se la comunicazione è bidirezionale (full Duplex) si utilizzano codici rilevatori e l’errore si risolve con la ritrasmissione del messaggio; se, invece, la trasmissione è unidirezionale (Simplex) si utilizzano codici correttori visto che il ricevente è impossibilitato a trasmettere. Nella teoria dei codici si possono utilizzare i seguenti teoremi: Teorema 1 Condizione necessaria e sufficiente affinché un codice sia in grado di rilevare errori di molteplicità K è che la distanza minima di Hamming sia almeno K + 1. Teorema 2 Condizione necessaria e sufficiente affinché un codice sia in grado di correggere errori di molteplicità K e che la distanza minima di Hamming sia almeno 2K + 1. Codici rilevatori di errori Nel seguito sono presentati tre tipi di codici rilevatori di errori. I primi due sono i più utilizzati nella trasmissione seriale, che può essere asincrona,come nelle porte seriali del personal computer COM1 e COM2, oppure sincrona, come nelle schede di rete o nei collegamenti in internet. Codice a controllo di parità ( partity check ) Questo tipo di codice è costituito aggiungendo ad ogni parola un bit di controllo, come bit più significativo, in modo da rendere pari ( oppure dispari ) il peso di ogni parola formata da m = n + 1 Bit. Le caratteristiche di questo codice sono: Ridondanza: R = m/n = n+1/n = 1+1/n. Distanza minima di Hamming: h = 2 Molteplicità dell’errore dispari, cioè il codice è in grado di rilevare un numero di bit errati di valore dispari. Il controllo di peso pari e dispari presenta dal punto di vista matematico la stessa robustezza agli errori. Dal punto di vista pratico è invece consigliabile adottare il controllo di peso dispari in modo che la configurazione costituita da tutti 0 (assenza di collegamento) sia considerata errore, situazione non rilevabile utilizzando il codice a controllo di peso pari. Codice ciclico di ridondanza o controllo polinomiale I codici cilici di ridondanza CRC, detti anche codici a controllo polinomiale,si basano sul fatto che i bit che formano il messaggio possono essere considerati come coefficienti di un polinomio completo di grado n-1 in x; n rappresenta il numero dei bit del messaggio. Indichiamo questo polinomio con T(x). Si consideri poi un polinomio G(x), detto polinomio generatore, di grado inferiore al polinomio T(x) e avente il termine noto uguale a 1. Dalla parte della sorgente si divide il polinomio T(x) per G(x) e si calcola il resto, che indichiamo con R(x).Il trasmettitore invia il messaggio concatenato al resto R(x) cioè M(x) = T(x):R(x). Dalla parte del ricevente si deve fare l’operazione inversa: dal messaggio ricevuto M(x)’ = T’(x):R’(x) si prende la parte T’(x) e la si divide per il polinomio G(x), calcolando il resto R’’(x); se la trasmissione è corretta, R’’(x) deve essere uguale a R’(x), altrimenti il messaggio deve essere

27

considerato errato. Checksum Checksum, tradotto letteralmente significa somma di controllo. È una sequenza di bit che viene utilizzata per verificare l'integrità di un dato o di un messaggio che può subire alterazioni. Ad esempio un algoritmo potrebbe essere : • Suddivido il messaggio in blocchi di lunghezza fissa • Applico lo XOR ai bit di ciascun blocco ( controllo trasversale ) ottenendo T bit • Applico lo XOR ai bit di stessa posizione nei i blocchi (controllo longitudinale) ottenendo B bit. • Invio insieme al messaggio M , T e B cioè M:T:B Il ricevitore calcolerà T’ e B’ se T = T’ e B = B’ allora il messaggio ricevuto è corretto altrimenti potrò rilevare e in alcuni casi correggere gli errori. Ad esempio: controllo trasversale

1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0

controllo longitudinale Il messaggio originale di 48 bit è stato suddiviso in blocchi di 8 bit. E’ stato applicato lo XOR ai bit di ciascuna riga ( blocco ). Lo Xor è stato applicato ai bit di ogni colonna ( bit di uguale posizione in ciascun blocco ) i bit così calcolati sono inviati al destinatario insieme al messaggio. Nota Ricordiamo la tavola della verità dello Xor

a b a xor b

0 0 0 0 1 1 1 0 1 1 1 0

Osserviamo che calcolare lo xor su un gruppo di bit equivale a calcolarne il bit di parità pari. Codici autocorrettori Quando la trasmissione è di tipo Simplex, cioè il destinatario non è in grado di comunicare al mittente che il messaggio è arrivato in modo coretto, occorre utilizzare i codici correttori, codici in grado non soltanto di rilevare l’errore,ma anche di individuare la posizione del bit errato. Il codice è costituito con il controllo longitudinale(ed orizzontale) e trasversale (o verticale) del peso, pari o dispari, contenuto nel codice dei caratteri da trasmettere. Per esempio,supponiamo di dover inviare un blocco di 4 caratteri, ognuno dei quali è formato da 4 bit, come illustrato nella tabella seguente:

C1 0 0 1 1

C2 1 0 1 1

C3 1 1 1 0

C4 0 0 0 1

Applicando il controllo di parità dispari sia in verticale che in orizzontale, il blocco da trasmettere diventa il seguente:

28

C1 0 0 1 1 1

C2 1 0 1 1 0

C3 1 1 1 0 0

C4 0 0 0 1 0

1 0 0 0 0

Si osservi che il controllo longitudinale è applicato anche ai bit di controllo trasversale. Supponiamo ora che durante la trasmissione il bit più significativo del carattere C2 venga alternato passando da 1 a 0. Il ricevente ottiene la seguente tabella:

C1 0 0 1 1 1

C2 0 0 1 1 1

C3 1 1 1 0 0

C4 0 0 0 1 0

0 0 0 0 0

Il ricevente, facendo lo stesso tipo di controlli, rileva un errore nella riga 2 e nella colonna 1: questo significa che il bit errato si trova all’intersezione della riga e della colonna che non soddisfano il controllo. Pertanto il bit ricevuto come 0 viene corretto a 1. Codici a lunghezza variabile Una sorgente si dice discreta quando i simboli che può emettere sono in numero finito. Le proprietà che caratterizzano i simboli sono:

• La probabilità di emissione, • La quantità di informazioni da essi trasporta.

La probabilità di emissione indica la probabilità che un simbolo venga emesso tra gli N elementi dell’alfabeto. Se i simboli hanno tutti la stessa probabilità di emissione, questa vale P = 1/N Se le probabilità di emissione non è uguale per tutti i simboli, occorre calcolarla in modo empirico come: numero di volte che il simbolo si viene emesso P(si) = ----------------------------------------------------------- numero totale dei simboli emessi. Misura dell’ informazione Per informazione si intende tutto ciò che serve a togliere incertezza. Se la sorgente ha un alfabeto di 2 simboli, l’emissione di un simbolo fornisce una maggiore informazione rispetto alla sorgente precedente: in questo caso è come se una persona rispondesse “si” o “no” alle domande; la sua risposta toglie incertezza. La quantità di informazione trasporta da un simbolo è data dalla seguente formula:

l(S(i))=log1/p(S(i))

applicando la proprietà dei logaritmi, per la quale il logaritmo di un rapporto è uguale alla differenza dei logaritmi, si può scrivere: l(S(i))=log1-logP(S(i))=0-logP(S(i))=-logP(S(i)) Se i logaritmi sono in base 2, il risultato è espresso in bit. Possiamo definire il bit come l’unità elementare di informazioni.

29

Se una sorgente emette simboli tutti con la stessa probabilità, l’informazione associata ad un simbolo è data da:

I=1/log(2)p

Poiché p = 1/N, allora

I=log(2)1/1/N=log(2)N Si può notare che più grande è N, maggiore è l’informazione associata ad ogni simbolo che viene emesso. Nel caso minimo in cui la sorgente emetta 2 simboli, l’informazione vale log(2)=1 bit. Si possono fare anche le seguenti considerazioni: • L’ informazione associata a un simbolo si misura in bit. Il bit rappresenta l’informazione associata a un simbolo emesso da una sorgente con un alfabeto di 2 simboli indipendenti ed equiprobabili. Una sorgente che emette simboli equiprobabili si dice priva di memoria o a memoria zero.

• Maggiore è la probabilità di emissione di un simbolo e minore è il suo contenuto informativo rispetto ad un altro simbolo che ha probabilità di emissione minore. Lunghezza media di un codice Se una sorgente emette S(1),S(2); …S(n) simboli indipendenti, con probabilità p(1),p(2), …,P(n),codificati con parole lunghe l(1),l(2), …, l(n) bit, la lunghezza media del codice è data dalla seguente formula:

L=p(1)*l(1)+p(2)*l(2)+…+P(n)l(n)

Entropia Si definisce entropia l’ informazione media di una sorgente S che emette simboli indipendenti in sequenza. L’ informazione media della sorgente è :

H(S) = ∑ P(S(i)) * l(S(i)) = ∑ –P(S(i)) * log P(S(i))

Essa si misura in bit ed indica il grado di incertezza di ricevere un simbolo tra gli n dell’alfabeto della sorgente. La massima entropia si ha quando i simboli sono equiprobabili: applicando la formula in questo caso si ottiene

H(S)=logN.

Codice di Huffman I codici a lunghezza variabile si usano quando si conosce la probabilità di emissione dei simboli e questi non hanno la steassa probabilità. In questo caso, per aumentare l’ efficienza della trasmissione, si assegnano meno bit ai simboli più probabili e viceversa più bit a i simboli meno probabili. Il primo codice a lunghezza variabile, che utilizza la diversa probabilità di emissione dei simboli, è il codice morse, utilizzato in radiotelegrafia e che utilizza due simboli, il punto e la linea, per codificare i simboli dell’alfabeto e delle cifre numeriche. Nell’ uso dei codici a lunghezza variabile occorre risolvere il problema della condizione del prefisso: cioè nessuna parola del codice deve essere prefisso ( parte iniziale ) di una parola più lunga del codice, perché si potrebbe avere difficoltà in fase di decodifica. Per esempio, se la sorgente ha quattro simboli codificati con x1 = 1 , x2 = 10 , x3 = 11 E trasmette la sequenza x3 x2, la stringa del messaggio diventa 1110 In ricezione potrebbe essere interpretata come 1 1 10 Cioè x1 x1 x2 diversa da quella trasmessa. Il codice di huffman risolve il problema attraverso una struttura ad albero, in cui i simboli sono le foglie,utilizzando il seguente algoritmo. Algoritmo di generazione del codice Potremo suddividere l’algoritmo di generazione del codice in 3 fasi:

30

Prima fase 1. I simboli vengono ordinati in senso decrescente di probabilità; 2. I due simboli con minore probabilità vengono “fusi” in un nuovo simbolo con probabilità somma delle 2 probabilità dei due simboli componenti; 3. Si ritorna ad 1) fino a che la tabella ha un numero di simboli diverso da 1; Se l’unico simbolo rimasto ha probabilità 1 allora potremo passare alla fase 2. Seconda fase ( costruzione dell’albero ) A questo punto si costruisce l’ albero di Huffman che ha come radice il simbolo finale e come sotto alberi i simboli che lo hanno generato. Il processo è ricorsivo e termina quando tutte le foglie sono simboli originari. Si assegna 1 al sottoalbero di destra e 0 al sottoalbero di sinistra. Terza fase ( generazione del codice ) Per codificare i simboli basta attraversare l ‘ albero dalla radice al simbolo e registrare i bit che man mano si incontrano. Esempio: Prima fase Simbolo P(S) Simbolo P(S) Simbolo P(S) Simbolo P(S) Simbolo P(S)

S1 1/2 S1 1/2 S1 1/2 S1 1/2 D 1

S2 1/4 S2 1/4 S2 1/4 C 1/2

S3 1/8 A 1/8 B 1/4

S4 1/16 S3 1/8

S5 1/16

Attenzione prima di creare una nuova tabella riordinare in modo decrescente di probabilità. Seconda fase

D |

------------------------ 0| |1 S1 C ------------------------ 0| |1

S2 B ------------------------ 0| |1 A S3 ------------------------ 0| |1 S4 S5 Terza fase

31

Simbolo Codice

S1 0

S2 10

S3 111

S4 1100

S5 1111

Codici riflessi

I codici riflessi sono usati nei convertitori di segnali analogico/digitali e hanno le parole ordinate secondo i numeri naturali in modo che ogni parola P abbia distanza 1 dalla parola precedente, P-1, e dalla successiva P+1. I codici riflessi non sono ponderati e,poiché oltre a quantizzare una grandezza analogica si deve anche elaborarla,occorre appoggiarsi ad un codice ponderato come i codici binari puri. Codice Gray Il codice gray è un codice riflesso che ha la proprietà di avere semplici algoritmi di trasformazione da codice binario a codice gray e viceversa:per questo motivo è praticamente l’ unico codice riflesso utilizzato. La conversione di un numero non viene cifra per cifra ma nel suo complesso. I codici di gray non sono utilizzati nelle trasmissioni proprio perché, avendo distanza minima di hamming uguale a 1, non possono utilizzare tecniche di rilevazione o correzione degli errori. Per convertire una parola binaria a una parola del codice di gray si applica il seguente algoritmo: 1)Procedendo da sinistra verso destra, per ricavare il bit della parola di gray di posto i si esegue l’operazione di OR esclusivo tra il bit di posto i e il bit i-1 della parola in binario. 2)Il primo bit della parola di gray si ottiene facendo l’ OR esclusivo tra 0 e il bit di posto 1 della parola binaria. Esempio Convertire in codice di Gray i numeri 55, 56, 57 che hanno la seguente codifica binaria: 55= 110111 , 56=111000 , 57=111001

w n 1 2 3 4 5 6

pb 55 1 1 0 1 1 1

pg 55 1 0 1 1 0 0

pb 56 1 1 1 0 0 0

pg 56 1 0 0 1 0 0

pb 57 1 1 1 0 0 1

pg 57 1 0 0 1 0 1

La prima colonna indica la parola :PB per la parola binaria,Pg per la parola di Gray. La seconda parola indica il valore decimale del numero. Le altre colonne contengono i bit della codifica.

32

Ricordando che l’OR esclusivo vale 1 se i due bit sono diversi e zero se sono uguali, nel caso della conversione dl numero 55:

• il primo bit di Gray vale 1 perché il primo bit della parola binaria è 1 e bisogna farne l’OR esclusivo con lo zero;

• il bit 2 di Gray vale 0 perché il bit 1 ed il bit 2 della parola binaria sono entrambi 1;

• il bit 3 di Gray vale 1 perché il bit 3 della parola binaria è 0 mentre quello di posto 2 è 1 e cosi via.

Il procedimento inverso, per convertire una parola dal codice di Gray al codice binario, applica il seguente algoritmo:

• si esamina la parola di Gray da sinistra verso destra : i bit della parola binaria sono uguali a quelli di Gray fino al primo bit di valore 1 che si incontra.

• Dal bit successivo:

• se il bit di Gray è 0, il corrispondente bit binario è uguale al bit che immediatamente lo precede;

se il bit di Gray è 1, il corrispondente bit binario è l’opposto del bit che immediatamente lo precede. Come esempio, consideriamo i numeri precedenti in codice di Gray e li riportiamo in binario.

w n 1 2 3 4 5 6

pg 55 1 0 1 1 0 0

pb 55 1 1 0 1 1 1

pg 56 1 0 0 1 0 0

pb 56 1 1 1 0 0 0

pg 57 1 0 0 1 0 1

pb 57 1 1 1 0 0 1

Per ottenere la parola binaria del numero 55 a partire dalla corrispondente parola di Gray si opera in questo modo:

• il primo bit della parola binaria è 1 perché il primo bit di Gray è 1 ;

• il bit 2 della parola binaria è 1 perché il bit 2 di Gray è 0, quindi il bit 2 della parola binaria è uguale al precedente che è 1. il bit 3 della parola binaria è 0 perché il terzo bit di Gray è 1 e quindi il terzo bit binario deve essere l’opposto del suo secondo bit, e cosi via. Trasmissione in banda base L’informazione binaria è trasmessa modificando lo stato elettrico del canale trasmissivo. La modalità di segnalazione fondamentali sono: Segnalazione in banda base quando il segnale è immesso direttamente in linea. Segnalazione con modulazione quando il segnale deve subire una modifica prima di essere immesso in linea. I codici di linea più diffusi per la segnalazione in banda base sono: • NRZ (non ritorno a zero)

33

• RZ (ritorno a zero) • NRZI ( non ritorno a zero invertito) • Manchester • Manchester differenziale Definizione: il bit time è la durata del segnale elettrico associata al singolo bit; esso è l’inverso della velocità di trasmissione. Definizione: la larghezza di banda è l’insieme di tutte le frequenze entro le quali il segnale non subisce modifiche tali da renderlo irriconoscibile. Segnalazione NRZ(non ritorno a zero) Ciascun bit mantiene il livello elettrico associato per tutto il bit time. Più bit uguali consecutivi comportano la trasmissione di un segnale sempre con la stessa polarità. L’impulso di temporizzazione, utilizzato in ricezione per la decodifica di linea, è sincronizzato a metà del bit time: in questo modo un eventuale sfasamento tra il trasmettitore ed il ricevitore non provoca lo spostamento della lettura del segnale associato ad un altro bit. Segnalazione RZ(ritorno a zero) In questo tipo di segnalazione metà del tempo di bit è utilizzato per trasmettere il bit e per l’altra metà lo stato elettrico della linea viene portato allo zero logico:in questo modo si ha una netta separazione dei bit di valore uguale a 1. L’impulso di temporizzazione avviene a ¼ del bit time. Ricordando la definizione di larghezza di banda fornita in precendeza , si può affermare , secondo la dimostrazione di Nyquist, che in un canale , in assenza di rumore , la massima velocità di trasmissione ( espressa in bit al secondo) è data nella seguente formula: Vmax = 2*B*log2 S bit/sec Dove B è la banda passante,S è il numero simboli(livelli) con cui il segnale viene discretizzato. Normalmente un segnale è discretizzato su 2 livelli con cui essendo S=2, la velocità(teorica) massima di trasmissione è. Vmax = 2*B*log2 2 = 2*B Dalla formula si vede che il segnale è discretizzato su 4 livelli, la velocità massima teorica consentita dal mezzo trasmissivo risulta raddoppiata. Per codificare 4 livelli servono 2 bit(dibit, quando nello stesso bit time viene trasmesso un simbolo codificato con 2 bit. Analogamente se, anziché discretizzare su 2 livelli, si usano 8 livelli, ogni simbolo è rappresentato da 3 bit (tribit). Essendo S=8, calcolando il logaritmo, si ottiene una velocità massima triplicata. Si definisce una velocità di emissione dei simboli(espressa in Baud) il numero di simboli emessi in un secondo (bit, dibit, tribit e cosi via). Pertanto solo su una discretizzazione su 2 livelli,la velocità di emissione dei simboli in Baud coincide con la velocità di trasmissione in bit al secondo. Shannon ha dimostrato che la velocità massima di trasmissione in un canale disturbato( molto più realistico) è data dalla formula Vmax = B*log2 (1+S/N) Dove S/N esprime il rapporto tra segnale e disturbo. La codifica in un’onda a 2 livelli in un’onda a 4 livelli. In questo modo si può raddoppiare la velocità di trasmissione, a fronte di una maggiore sensibilità ai disturbi e quindi una più elevata probabilità di errore. Segnalazione NRZI(non ritorno a zero invertito) In questa codifica se il bit da trasmettere è 1 si lascia la linea al livello precedente, se è 0 si fa cambiare livello. Questa segnalazione di linea è abbastanza diffusa nelle reti geografiche(WAN, Wide area network). È utilizzata per imporre transazioni sulla linea in modo che i clock del trasmettitore è ricevitore rimangano agganciati in fase. Infatti, se la stringa da trasmettere fosse formata da una stringa molto lunga di bit di valore 1, non si avrebbe inversione di linea, con il rischio che i clock del trasmettitore e del ricevitore sfasino. Si avrebbero di conseguenza ,molti errori di freme (freme error), cioè errori dovuti al mancato riconoscimento della struttura del messaggio, e in ricezione non si saprebbe più cosa rappresentano i bit ricevuti. Per evitare questo si usa, insieme alla codifica di linea, la tecnica del bit stuffing(o zero inserito) che consiste nell’aggiungere in trasmissione uno 0 ogni cinque bit di valore 1 e,ovviamente in ricezione

34

togliere dal messaggio il bit 0 che viene letto dopo aver letto 5 bit di valore 1. Questi tipi di segnalazione sono i più diffusi nelle reti locali(LAN,Local area network), Hanno il grande vantaggio di eliminare il clock da ogni stazione collega, perché consente l’autotempificalzione, in presenza di numerose variazioni di livello. Codifica di Manchester Questa codifica prevede che per rappresentare l' 1 si usi una transizione verso il basso a meta' del bit-time mentre per codificare lo 0 una transizione verso l'alto, sempre a meta' del bit-time.

I vantaggi sono : • Il riconoscimento degli 1 e degli 0 e' più sicuro; infatti non si misura l'ampiezza dell'impulso (alto per 1 e basso per 0 ) ma si usa l'inversione di polarità, facilmente riconoscibile anche in caso di presenza di disturbi. • Fornisce la sincronizzazione per tutte le interfacce collegate alla rete.

Nella codifica di Manchester differenziale la seconda metà del bit time, come nella precedente ,serve per la sincronizzazione, mentre per la prima metà si opera nel seguente modo: se il bit da trasmettere è 1, la linea non cambia di livello; se,invece,il bit da trasmettere è 0 la linea cambia di livello. Le reti che utilizzano questo tipo di segnalazione seguono lo standard IEEE 802.5. Entrambe le tecniche impongono transizioni, ma hanno il difetto di utilizzare solo metà della banda. Trasmissione con modulazione I collegamenti in banda base sono utilizzati per collegare circuiti fissi a una distanza breve(qualche chilometro) in genere in ambito urbano. Per trasmettere attraverso a un canale telefonico, un segnale in banda base è necessario modularlo (cioè modificarlo), trasportandolo su una banda di frequenze più opportuna. La modulazione con portante analogica consiste nel far variare, con la stessa legge del segnale in banda base,un segnale portante (carrier) di tipo sinusoidale avente una frequenza opportuna. I parametri che caratterizzano una sinusoide sono: • Ampiezza • Frequenza • Fase Se si fa variare uno di questi parametri del segnale portante con la stessa legge del segnale in banda base, si ottiene rispettivamente: • Modulazione di ampiezza • Modulazione di frequenza • Modulazione di fase Poi si possono anche combinare due tipi di modulazione, normalmente frequenza e fase L’oggetto che consente la modifica del segnale portante in trasmissione si chiama modulatore mentre

35

quello in ricezione demodulatore.Il modem invece fa entrambe le funzioni di modulazione e demodulazione ed è un dispositivo hardware. La modulazione di ampiezza varia l’ampiezza della portante. La modulazione di frequenza modifica la frequenza della portante. Nella trasmissione numerica si utilizza una modulazione di tipo FSK (Frequency shift keying ) realizzata per spostamento di frequenza, in cui il passaggio da una frequenza all’altra avviene con continuità di fase. Praticamente si prende la frequenza della portante e si aggiunge un ^f per trasmettere il bit 0, mentre si toglie lo stesso ^f per trasmettere un bit 1. Quindi sintetizzando f+^f rappresenta bit 0 f-^f rappresenta bit 1 La modulazione di fase avviene facendo variare la fase dell’onda portante in accordo alla variazione di polarità del segnale binario. La modulazione di fase utilizzata è di tipo PSK ( phease shifting keying ). Essa è efficiente in termini di potenza richiesta e di larghezza di banda. Si usa la modulazione sia di Bifase che polifase Per avere maggiore velocità di trasmissione si usa la modulazione polifase. Con la modulazione numerica è possibile l’integrazione della trasmissione e dell’elaborazione. E il tipo di modulazione utilizzato nelle reti ISDN ( intregated service digital network ). Per convertire un segnale da analogico a numerico si usa la modulazione PCM: essa si basa sul teorema del campionamento ( o teorema di Shannon ) che afferma che per trasmettere un segnale analogico di banda base e ampiezza limitate ( finite ), non serve trasmettere l’intero segnale, ma bastano alcuni campioni presi a una frequenza almeno doppia della banda del segnale. Di conseguenza un segnale analogico continuo nel tempo viene dapprima campionato,discretizzato nel tempo, quindi viene quantizzato, cioè discretizzato in ampiezza e infine codificato, ossia i livelli quantizzati vengono tradotti in bit. Generalità sui protocolli Il protocollo è l’insieme delle regole stabilite tra la sorgente e il destinatario, costituite per scambiare in miglior modo le informazioni. Nel protocollo sono definite : • Sintassi • Semantica • Templificazione Livello fisico: Rappresenta il trasferimento fisico del messaggio, non si occupa del significato del messaggio,ma che venga trasmesso senza errori ed in ordine . Livello utente: Anche detto end to end (utente finale - utente finale ), si occupa del dialogo tra i due utenti senza preoccuparsi delle modalità con cui far arrivare il messaggio. In quetsa fase si parla di negoziazione del protocollo: se , ad esempio, nella comunicazione i due interlocutori parlano due lingue diverse .si stabilisce una lingua ,comune ai due,di riferimento . Livello di presentazione : Nell’ esempio prima citato, i due interlocutori devono trovare un interprete (o due) che traduca nella lingua di riferimento . Trasmissione parallela, seriale sincrona e seriale asincrona Abbiamo una trasmissione parallela se i bit che rappresentano i caratteri del messaggio da trasmettere vengono inviati contemporaneamente su più linee.

36

Poiché si usa una linea per bit non è possibile usare per la trasmissione la rete telefonica esistente. La rete telefonica, infatti, è stata realizzata per trasmettere la voce su un solo filo per cui possiamo trasmettere un bit per volta con una modalità di trasmissione seriale.

La trasmissione parallela è utilizzata per collegamenti di breve distanza, anche se, a parità di condizioni, fornisce una maggiore velocità di trasmissione (in genere 8 volte). Periferica lenta Definiamo lente le periferiche i cui segnali forniti o ricevuti permangono in uno dei due stati elettrici per un tempo molto maggiore rispetto al tempo di esecuzione del relativo programma di controllo. Periferiche a media velocità Definiamo a media velocità le periferiche i cui segnali forniti o ricevuti sono confrontabili con il tempo di esecuzione del relativo programma di controllo. Periferiche ad alta velocità Definiamo ad alta velocità le periferiche i cui segnali forniti o ricevuti sono minori rispetto al tempo di esecuzione del relativo programma di controllo. Trasmissione seriale asincrona Il protocollo seriale asincrono è nato per collegare periferiche a bassa velocità di trasmissione. Prevede che venga trasmesso un byte per volta.

Ogni carattere ( byte ) è preceduto da un bit di start ( a 0 ) per consentire al destinatario di sincronizzarsi, da un bit di stop per comunicare che la trasmissione è finita, seguito a sua volta da uno stato di idle ( a 1 ) prima del successivo carattere. Trasmissione seriale sincrona Per migliorare l’efficienza di trasmissione e avere meno problemi nella trasmissione di file binari si utilizza la trasmissione seriale sincrona. Le sue caratteristiche principali sono: • Vengono eliminati i bit di start e di stop. • Si eliminano eventuali bit di controllo per ogni carattere.

37

• Utilizza procedure più efficienti per la gestione degli errori (codici CRC). • È in grado di trasmettere file binari. Nel caso della trasmissione seriale sincrona occorrono almeno due linee che vengono rispettivamente utilizzate per la trasmissione/ricezione dei dati e per la trasmissione/ricezione del clock ( orologio ). Infatti così come l'orologio scandisce i secondi i minuti e le ore, il clock scandisce la persistenza di un valore fisico nell'istante di tempo considerato.

Quando infatti una stazione sincrona trasmette il proprio dato seriale verso una stazione ricevente, provvede innanzi tutto ad inserire il dato sulla linea data e poi provvede a delimitare la sua validità trasmettendo su il secondo filo dedicato, un impulso di clock , affinché la stazione ricevente sia informata di prendere in considerazione solo il valore del dato trasmesso nell'intervallo di tempo delimitato dall'impulso di clock ricevuto. Naturalmente come mezzo trasmissivo è possibile utilizzare varie fattispecie, infatti al posto di due fili potremmo utilizzare una portante in radiofrequenza con due canali di cui uno dedicato ai dati e l'altro alla trasmissione/ricezione del clock.

I vantaggi della modalità sincrona sono senza dubbio derivati da una elevata velocità di trasmissione dei dati unita ad un minore tasso di errore in quanto per la natura stessa (sincrona) del campionamento dei bit risultano più improbabili errori di interpretazione da parte della stazione ricevente. Di contro le risorse trasmissive impegnate sono maggiori.(due fili al posto di uno) Mezzi trasmissivi fisici Nei primi processi di comunicazione i canali trasmissivi erano resi possibili dall’uso di materiali metallici come il rame ,in grado di trasportare l’energia elettrica . I mezzi trasmessivi erano essenzialmente il doppno e i cavi coassiali, nei tempi recenti si usano fibre ottiche o i canali wireless. I mezzi trasmessivi devono avere queste caratteristiche : • Bassa resistenza • Bassa capacità • Bassa induttanza Con queste tre proprietà la potenza trasmessa arriva al ricevitore e il segnale arriva pulito Doppino Detto anche TP ( Twisted Pair ) , costituito da due fili di rame intrecciati o a forma elicoidale ; possono essere lineari (TP) cioè attorcigliati (twist) con una certa regolarità ( pair ) , in modo che gli effetti elettromagnetici siano nulli. Sono usati per lo più nella telefonia (con una banda di 4Hz(fonica)).

38

I doppini sono classificati in : UTP ( Unshlieded Twisted Pair ) non schermati , le coppie sono riunite in un cavo. FTP ( Failed Twisted Pair ) tutte le coppie sono protette da un'unica schermatura (alluminio o di poliestere ) STP ( Shielded Twisted Pair ) Le singole coppie sono schermate I cavi UTP, STP sono suddivisi in diverse categorie: categoria 1 - due coppie per solo uso telefonico. categoria 2 - velocità 4 Mbits/sec. (cavi telefonici) categoria 3 - frequenza 16 Mhz, velocità 10Mbps (Ethernet 10baseT, TokenRing 4Mbps) categoria 4 - frequenza 20 Mhz, velocità 10Mbps (Ethernet 10baseT, TokenRing 16Mbps) categoria 5 - frequenza 100 Mhz, velocità 100Mbps (Ethernet 10/100baseT o Fast Ethernet) categoria 5e - frequenza 100 Mhz, velocità 1Gbps (Ethernet 1000baseT o Gigabit Ethernet) categoria 6 - frequenza 200 Mhz, velocità 1GMbps (Ethernet 1000baseT o Gigabit Ethernet) categoria 7 - frequenza 600 Mhz, velocità 10Gbps (10 Gigabit Ethernet) Cavo coassiale Il cavo coassiale è formato da un conduttore centrale in rame (anima) circondato da uno strato isolante avvolto da una calza metallica che fa da schermo (che funzionano da gabbia di faraday per conduttore interno.

Molto utilizzato nel passato per collegamenti a velocità massima di 10Mbit/sec era usato per le linee telefoniche su grandi distanze oggi sostituito dalle fibre ottiche. E’ stato anche utilizzato nelle reti locale come l’ ethernet .E’ andato in disuso per le difficoltà di installazione. Fibra ottica È un filo sottilissimo (formato da materiale vetroso o di plastica) con un diametro che varia dai 3 ai 200 ( nano ) mt . Le informazioni sono trasmesse grazie al principio della riflessione nella propagazione della luce . La fibra ottica presenta alcuni vantaggi : • Immunità ai disturbi elettromagnetici • Elevata capacità trasmissiva (nell ordine dei Gbit/sec) Ci sono anche dei svantaggi nell’uso della fibra ottica : • Difficoltà nell’unire due fibre • Difficoltà nel collegarle ai connettori

La fibra ottica è formata da: core (nucleo );con ujna sezione circolare di diametro che varia da 50 a 80(nano )mt cladding(mantello);serve ad evitare la dispersione della luce all’esterno;ha una sezione circolare con diametro di 125§(nano)mt

39

rivestimento primario protettivola luce si propaga nel core che si riflette sulla separazione fra core e cladding, il cladding evita che la luce si disperda .Il core ed il clading hanno un diverso indice di rifrazione ,ciò consente alla luce di non disperdersi. Il sistema ottica deve avere come sorgente luminosa un led o un laser ,che sono in grado di trasformare un segnale da elettrico a luminoso. Il ricevitore è generalmente un fotodiodo Mezzi tramissivi di tipo wireless I collegamenti wireless sfruttano il fatto che le onde elettromagnetiche viaggiano nello spazio alla velocità della luce e possono indurre corrente in un dispositivo ricevente (antenna) anche molto distante. Le applicazioni attuali sono orientate verso le reti wireless che sfruttano le microonde per trasmettere informazioni. I principali vantaggi della tecnologia wireless, oltre a quello di liberarci dai cavi, sono di: • Essere facilmente installabili • Essere facilmente configurabili • Essere economicamente più convenienti • Installare reti di calcolatori in palazzi che non si possono cablare • Permettere di collegare stazioni mobili alla rete aziendale • Utilizzare reti mobili WLAN • Collegarsi autonomamente in internet grazie ai notebook e ai telefoni cellulari • Crearsi una WPAN collegando in rete tutti i dispositivi personali come cellulari, cuffie, notebook e altro.

40

ARCHITETTURA DI UN SISTEMA A MICROPROCESSORE Introduzione

Agli inizi degli anni '60 comparvero sul mercato i primi circuiti integrati digitali. Servendosi di tali dispositivi divenne più semplice la progettazione e la realizzazione di sistemi logici. Utilizzando la tecnica denominata a logica cablata, i sistemi venivano progettati utilizzando i circuiti integrati digitali offerti dal mercato ( porte logiche, registri, contatori, ecc.) in funzione dell'applicazione specifica. Inoltre, aumentando sempre più il numero di componenti integrati su un unico chip di silicio, ovvero le funzioni logiche che il singolo circuito integrato era in grado di svolgere, divennero sempre più complesse e sofisticate le funzioni disponibili. Tuttavia il costo del dispositivo integrato aumentava con la sua complessità, e solo una sua larga diffusione permetteva l'abbattimento del costo di produzione, cosa non sempre possibile in quanto esso spesso era rivolto ad utilizzazioni specifiche. Nacque pertanto ben presto la necessità di disporre di un unico dispositivo che permettesse di essere utilizzato in applicazioni diverse con poche modifiche. Sulla base di queste motivazioni venne realizzato agli inizi degli anni '70 un circuito integrato cui fu dato il nome di microprocessore (C.P.U. = Central Process Unit). Tale dispositivo aveva bisogno di essere programmato, cioè era necessario fornirgli una successione ordinata di istruzioni sul modo di operare. Il microprocessore può quindi essere considerato un dispositivo adatto a svolgere funzioni diverse, modificando solo in modo minimo la parte circuitale ( hardware ) ad esso connessa, ma variando di volta in volta, in base all'applicazione richiesta, il programma di gestione ( software ). I sistemi realizzati con l'applicazione di una CPU sono detti a logica programmabile. Il microprocessore può essere utilizzato in una vastissima gamma di applicazioni che vanno dai sistemi di controllo, alla strumentazione di misura, dalle apparecchiature domestiche quali lavastoviglie e televisori a quelle elettromedicali, senza dimenticare una delle più diffuse applicazioni, ovvero il Personal Computer. Architettura di un sistema a microprocessore

Un microprocessore in genere, pur contenendo al suo interno tutti i circuiti di calcolo e di controllo, per poter operare correttamente ha bisogno di essere collegato con altri dispositivi in base alle applicazioni per cui il processore è impiegato (da solo non è utilizzabile). Al microprocessore debbono essere collegati sia dei moduli di memoria che i dispositivi per l’ingresso e l'uscita dei dati. E dunque necessario parlare di sistema a microprocessore e non semplicemente di microprocessore. Nella figura è riportato un semplice schema di sistema con memorie e dispositivi di I/O. In esso è evidenziata la funzione di collegamento tra i vari componenti svolta dai bus dati, bus indirizzi e bus di controllo.

C P U memoria

interfacce dispositivi input

interfacce dispositivi output

bus indirizzi

clock interrupt reset

bus dati

input output

R / W

nmi

41

Il sistema è costituito da una CPU da memorie RAM e ROM da uno o più dispositivi d'ingresso

e d'uscita. Lo schema può servire per comprendere come il microprocessore possa scambiare informazioni con la memoria e con i dispositivi di I/O (Input / Output). Mediante il bus indirizzi vengono identificate le locazioni di memoria dove vengono memorizzati i dati nelle operazioni di scrittura o da cui la CPU riceve i dati (o i codici delle istruzioni, cioè il programma) nelle operazioni di lettura. Inoltre, sempre per mezzo del bus indirizzi il microprocessore identifica i dispositivi d'ingresso, ad esempio la tastiera di un computer, da cui riceve i dati nello operazioni di lettura da periferica o quelli d'uscita, ad esempio il monitor di un computer, a cui invia i dati nelle operazioni di scrittura su periferica. Il bus dati è utilizzato per il trasferimento (lettura o scrittura) dei dati dalla CPU con le locazioni di memoria o con i dispositivi di ingresso / uscita (detti anche periferici o dispositivi di I/O). Il bus controlli, oltre a funzioni specifiche che non saranno qui esplicitate, è utilizzato dalla CPU per segnalare alla memoria e ai dispositivi di I/O la direzione del flusso dei dati e il tipo di dispositivo coinvolto nel trasferimento (memoria o I/O). L’architettura a BUS presenta diversi vantaggi il principale dei quali è dato dalla modularità del sistema; è infatti particolarmente semplice ampliare il sistema con l’aggiunta di nuovi componenti collegandoli ai BUS. Tale vantaggio risulta evidente pensando alle schede madri dei Personal Computer, dove attraverso gli slot di espansione è possibile ampliare le prestazioni e le caratteristiche del sistema attraverso nuove schede (es: modem, acquisizione dati, porte parallela) o nuovi chip di memoria. I diversi “oggetti” sono collegati ai bus con una modalità che consenta di evitare conflitti e/o indecisioni nella comunicazione che avviene sempre tra due soli componenti del sistema e quasi sempre uno dei due è il microprocessore. BUS DATI (bidirezionale)

Bus controllo Lo schema di figura (dove per semplicità si sono rappresentate solo 4 linee per bus) mette in evidenza i circuiti di decodifica che, generando dei segnali di chip select, permettono di selezionare i diversi dispositivi. I segnali CS permettono di togliere il componente dallo stato di alta impedenza (che corrisponde al virtuale scollegamento del componente dal bus dati) garantendo la corretta comunicazione solo tra due componenti. Altri segnali particolarmente importanti per la comunicazione provengono dal BUS CONTROLLI e sono i segnali di READ e WRITE, pilotati dalla CPU, e specificano la direzione dei dati nel trasferimento. Elementi caratteristici di una CPU La CPU costituisce il cuore e l’elemento più importante del sistema; in esso sono rappresentate le funzioni logiche, di controllo e aritmetiche. La CPU è in grado di prelevare le istruzioni del programma da svolgere contenute nella memoria (fase di fetch) e di interpretarle ed eseguirle (fase di execute). Tale istruzioni sono evidentemente in forma binaria. Grazie ai programmi compilatori è possibile scrivere programmi per Personal Computer utilizzando linguaggi particolarmente semplici ed intuitivi (linguaggi ad alto livello) che vengono poi tradotti nell’unico linguaggio interpretato ed eseguito dalla CPU che viene denominato linguaggio macchina. Le principali caratteristiche di una CPU che ne identificano le peculiarità e la potenza possono essere cosi sintetizzate:

42

Set istruzioni, cioè l’insieme delle istruzioni che la CPU è in grado di svolgere; Velocità di funzionamento ed esecuzione delle istruzioni; si identificano tali caratteristiche attraverso il clock di sistema (frequenza di funzionamento passata negli anni da qualche MHz a centina di Mhz) e il MIPS (milioni di istruzioni eseguite in un secondo). Architettura interna, insieme dei registri di lavoro, coprocessore matematico per svolgere le operazioni logico aritmetiche di una certa complessità, memoria cache per il reperimento veloce delle

istruzioni

I registri sono memorie di pochi bit (8, 16, 32 o 64 ) che possono memorizzare dati, indirizzi di memoria o istruzioni di programma prelevati dalla memoria. I registri vengono utilizzati come memoria di transito per appoggiare provvisoriamente i dati. Consentono un funzionamento più efficiente della CPU, evitando l’accesso continuo alla memoria esterna. L'Unità di Controllo. è l'organo o unità che gestisce, controlla e presiede l'esecuzione di tutte le operazioni di elaborazione per il particolare programma da eseguire ovvero comanda tutte le altre parti del processore attraverso il pilotaggio dei componenti stessi (ALU ecc..) impartendo a questi comandi di input e facendo da supervisore; rappresenta la parte a logica sequenziale della macchina a stati generale che, a sua volta, rappresenta la logica elettronica generale del processore stesso. Ad essa spetta, ad esempio, • l'interpretazione dell'istruzione che si trova di volta in volta nel registro IR; • abilitare alla lettura ed alla scrittura due registri tra i quali deve avvenire uno scambio di informazione. L'unità di controllo scandisce i passi o stati di un'istruzione: • fetch: preleva l’ istruzione dalla memoria e determina il tipo di istruzione, i suoi argomenti • execute: esegue l’istruzione, memorizza i risultati, ripete il ciclo. Tutte le fasi del ciclo del processore avvengono attraverso l'invio ai vari componenti di un insieme di impulsi di controllo, in una sequenza temporale ben precisa. Più precisamente, ad ogni colpo di clock le linee di controllo assumono un particolare stato; il susseguirsi dei diversi stati contribuisce all'esecuzione completa di un'istruzione. Per questo motivo si può dire che una singola istruzione in linguaggio macchina viene eseguita attraverso la opportuna composizione di più micro-operazioni. ALU., l'unità logico-aritmetica, è l'organo deputato allo svolgimento di

43

• operazioni aritmetiche ( somma, sottrazione, moltiplicazione, divisione, cambio di segno ); • operazioni logiche ( or, and, xor, not ); • confronti; • operazioni di scorrimenti e rotazione a sinistra e a destra di un dato;. Essa preleva gli operandi tipicamente dai registri generali, così come nei registri generali depone i risultati dei calcoli. In seguito ad un calcolo l'ALU ha anche il compito di impostare alcuni flag in modo da tenere traccia di determinati eventi (es. riporto di una somma). La Memoria. Contiene un numero generalmente molto elevato di celle nelle quali vengono memorizzati i dati e le istruzioni di un programma. Ogni cella è caratterizzata da un indirizzo ( intero positivo ) specificando il quale è possibile leggere o scrivere nella cella stessa. Il tempo impiegato per accedere ad una cella di memoria è costante e superiore a quello impiegato per l'accesso ad uno dei registri del processore. È per questo motivo che, per quanto possibile, si tenta di utilizzare i registri interni per effettuare le operazioni, limitando gli accessi in memoria allo stretto necessario. Pur contenendo la memoria un numero molto elevato di celle, in ciascun istante temporale solo uno di questi è abilitato a partecipare ad operazioni di lettura o scrittura: quello il cui indirizzo è contenuto nel registro MAR. Per sopperire alla lentezza della memoria RAM è stata introdotta anche la memoria cache.

Internal Bus. È un canale di comunicazione principale condiviso dai vari componenti ed attraverso il quale essi possono dialogare scambiandosi informazioni quali comandi di input, output ecc.. In questo contesto, il dialogo consiste nello scambio di dati binari tra registri secondo una modalità parallela. Ciò significa che un certo numero di bit viene contemporaneamente trasferito attraverso il bus da un registro mittente ad un registro destinatario. Durante un'operazione di trasferimento, i due registri implicati nella comunicazione si trovano in uno stato di lettura (destinatario) e scrittura (mittente) in modo tale da poter acquisire il dato presente sul bus e da potercelo scrivere, rispettivamente. Tutti gli altri registri sono in uno stato di “riposo” nel quale non possono né leggere i dati che circolano sul bus né influenzare lo stato del bus con i dati che contengono. Il numero di bit contemporaneamente trasferiti indica il parallelismo del bus ed è pari al numero di bit contenuti in un singolo registro. Esso caratterizza anche il parallelismo interno del processore.

Il Data Bus e il registro MDR. Il Data Bus è un bus che collega la memoria con il registro MDR ( Memory Data Register ). Esso serve a trasferire dati in entrambi i sensi, sempre secondo una modalità parallela. Tutti i dati e le istruzioni che dalla memoria devono essere elaborati nel processore, transitano inoltre attraverso il registro MDR e solo successivamente da questo raggiungono gli opportuni registri per l'elaborazione vera e propria. Analogamente, tutti i risultati (output) di un'elaborazione che devono essere immagazzinati in memoria transitano prima per il registro MDR e solo successivamente da esso raggiungono l'esatta posizione (cella) di memoria.

L'Address Bus e il registro MAR. Durante un accesso alla memoria, sia in fase di lettura che in fase di scrittura, il registro MAR ( Memory Address Register ) contiene l'indirizzo della cella di memoria a cui si deve accedere. Questo indirizzo, trasferito all'organo memoria attraverso l'Address Bus, abilita alla comunicazione una sola tra tutte le locazioni di memoria (celle) disponibili.

Il registro PC. (Program Counter). Contiene l’indirizzo di memoria in cui è contenuta la prossima istruzione da eseguire. Esso viene interrogato tipicamente all'inizio di ogni fase di fatch ed immediatamente dopo viene aggiornato alla posizione di memoria “seguente” preparandolo così per il prelievo dell'istruzione successiva. Può accadere comunque che l'istruzione prelevata rientri nella categoria delle istruzioni di salto: in questo caso si procede ad un ulteriore aggiornamento del PC durante la fase di execute dell'istruzione. Da questo deriva che lo scopo di un'istruzione di salto (condizionato) è esclusivamente quello di alterare (eventualmente) il valore del PC. Spesso il registro PC è chiamato anche IP (Instruction Pointer).

Il registro IR ( Instruction Register ). Questo registro ha il compito di accogliere dalla memoria (attraverso il MDR), durante una fase di fetch, l'istruzione da eseguire, quella cioè puntata dal PC. Una

44

volta in questo registro, l'istruzione deve essere interpretata dall'unità di controllo per procedere alla eventuale fase di preparazione degli operandi ed alla fase di esecuzione. Il registro di stato o dei flag è un registro che memorizza una serie di bit detti flag indicativi dello stato corrente del processore. Ad esempio: ZF = Zero flag (o flag zero). Indica se il risultato di un'operazione matematica o logica è zero. CF = Carry flag (o flag di riporto). Indica se il risultato di un'operazione produce una risposta non contenibile nei bit usati per il calcolo. SF = Sign flag (flag di segno). Indica se il risultato di un'operazione matematica è negativo. OF = Overflow flag. Indica se il risultato di un'operazione è in ovwrflow, secondo la rappresentazione in complemento a 2. È simile al carry flag, ma viene impiegato nelle operazioni in cui è presente il segno degli operandi. IF = Interrupt enable flag (o flag di abilitazione dell'interruzione). Gli interrupt possono essere abilitati ponendo a 1 questo flag, se 0 allora sono disabilitati. PF = Parity flag (o flag di parità). Indica se il numero di bit del risultato è pari o dispari. I registri generali I registri generali non hanno un preciso ruolo come gli altri, e da ciò scaturisce il loro nome. Sono utilizzati per contenere i dati in transito per un'elaborazione: gli addendi di un'addizione che l'ALU sta per effettuare, il risultato di un calcolo che l'ALU ha effettuato, un indirizzo di memoria in cui si trova un dato che dovrà essere acceduto in seguito, ecc. Un numero elevato di tali registri conferisce maggiore flessibilità nella programmazione, ma complica la struttura del processore dal punto di vista architetturale.

Classificazione memorie Le memorie sono organizzate in byte ( 8 bit ) ognuno dotato di indirizzo rappresentato da un numero intero positivo. Per poter leggere o scrivere ( accedere ) ad un byte è necessario specificare prima l’indirizzo del byte a cui si vuole accedere. A volte si parla di parola o word costituite da 2 byte. La capacità della memoria è il numero massimo di byte che essa può contenere. Il tempo di lettura è l’intervallo di tempo che intercorre fra l’inizio dell’indirizzamento del byte che si vuole leggere a quando il dato risulta disponibile. Il tempo di scrittura è l’intervallo di tempo che intercorre fra l’inizio dell’indirizzamento del byte che si vuole scrivere a quando il dato viene scritto in memoria. Il tempo di accesso è una media fra il tempo di scrittura e quello di lettura. Le memorie possono essere volatili e non volatili: le prime perdono i dati contenuti in mancanza dell’alimentazione le seconde no. Un’ altra possibile classificazione è: ROM ( read only memory ) vengono scritte quando sono fabbricate e non possono essere più cancellate. PROM ( programmable ROM ) possono essere scritte dall’ utente tramite dei programmatori appositi e da quel momemnto diventano ROM. EPROM ( erasable PROM ) programmabili e cancellabili più volte. EEPROM ( electrically erasable programmable ROM ) è un tipo di memoria non volatile cancellabile elettricamente RAM ( random access memory ) sono memorie volatili. Modalità di esecuzione di un’istruzione Dopo aver esaminato le caratteristiche degli elementi che compongono un generico sistema a microprocessore vediamo come essi siano coinvolti nell’esecuzione di una istruzione. Una generica istruzione è formata:

Il codice operativo rappresenta l’azione che la CPU deve eseguire sugli operandi ( registri o dati ) . Ad esempio

Codice operativo Codice operando o campo dati

45

0110 mov ax, 30 3E ; prima istruzione 0111 30 0012 inc ax 3C ; seconda istruzione Il codice operativo della prima istruzione è 3E mentre il campo dati è il numero 30 e nell’ insieme

l’istruzione è lunga 2 byte. La seconda istruzione è lunga 1 byte . Nel complesso la prima istruzione pone nel registro a 16 bit AX

il dato 30, la seconda lo incrementa di 1. Dopo l’esecuzione della seconda istruzione in AX avremo 31. Fase di fetch della prima istruzione La CPU deve prelevare la prima istruzione il cui indirizzo 0110 è nel registro PC quindi: 1. Il contenuto di PC 0110 viene posto sul bus indirizzi 2. Il contenuto della cella 0110 viene posto sul bus dati; 3. L’istruzione trasferita nel registro IR viene decodificata, permettendo alla logica di controllo

di generare i segnali necessari a eseguire effettivamente l’istruzione; 4. Il contenuto di PC viene incrementato di 1 ( il PC “punta” al dato 30 ) Fase di execute della prima istruzione 1. Il contenuto del PC (0111) viene posto sul bus indirizzi, “puntando così alla cella che contiene

l’operando 30; 2. Il contenuto della cella 0111 viene posto sul bus dati; 3. il dato dal bus dati viene trasferito in AX Fase di fetch della seconda istruzione 1. Il contenuto di PC (0112) viene posto sul bus indirizzi; 2. Il contenuto della cella 0112 viene posto sul bus dati; 3. L’istruzione trasferita nel registro IR viene decodificata, permettendo alla logica di controllo di

generare i segnali necessari a eseguire effettivamente l’istruzione; 4. Il contenuto di PC viene incrementato di 1 ( quindi punta alla terza istruzione); Fase di execute della seconda istruzione 1. Dal bus dati 30 viene trasferito in AX 2. La ALU incrementa di 1 il contenuto del registro AX

Gestione dei dispositivi di input / output Un sistema a microprocessore deve eseguire programmi più o meno complessi, trasferire dati alle periferiche esterne e ricevere da queste informazioni. Durante l'esecuzione dei programmi vi è anche un flusso continuo di dati dalla CPU alle memorie e viceversa. Il video, la tastiera, la stampante, il plotter, il drive ecc., sono gli esempi più noti di dispositivi periferici. In molti casi il trasferimento dei dati dalla CPU alle periferiche e alle memorie deve rispettare procedure ben precise e codificate. Le tecniche di scambio dei dati tra il sistema e le periferiche possono essere classificate in: polling, interruzione e DMA

L’utilizzazione di una tecnica piuttosto che un'altra richiede una attenta analisi delle procedure software e dei dispositivi hardware al fine di valutare quale sia la tecnica che aumenta l’efficienza del sistema a microprocessore e che meglio si adatti alle specifiche di progetto.

Polling ( interrogazione ciclica )

È la tecnica più semplice per lo scambio di informazioni tra microprocessore e le periferiche perché è essenzialmente software. Prevede che la CPU sotto il controllo di un apposito programma, controlli continuamente e in modo ciclico lo stato delle periferiche ad essa collegate.

Se il flag è attivo (generalmente a livello logico basso), la CPU esegue un programma di servizio al termine del quale verifica lo stato del flag della seconda periferica e così via. Naturalmente la CPU passa immediatamente a controllare il flag della seconda periferica se quella interpellata non ha bisogno dell'attenzione della CPU. Questa tecnica di gestione delle periferiche presenta alcuni problemi: • la CPU è impegnata continuamente a verificare i flag; • non si ha la possibilità di definire una gerarchia se due richieste arrivano contemporaneamente;

46

• se una periferica appena interrogata ha bisogno di essere servita dalla CPU deve aspettare, prima di essere nuovamente interrogata, che la CPU verifichi lo stato di tutte le rimanenti periferiche, e soddisfi le eventuali richieste di servizio da esse avanzate.

Interruzione ( Interrupt ) Per superare le limitazioni della tecnica del polling, la gestione dello scambio di informazioni tra CPU e periferiche è spesso affidata alla tecnica dell'interruzione, la quale prevede che sia la periferica, a differenza di quanto avviene ne polling, ad avanzare la richiesta di servizio alla CPU. In tal modo la periferica può interrompere la CPU in qualsiasi momento, in relazione alle esigenze specifiche, senza dover attendere i tempi dell’interrogazione ciclica. Tutte le CPU sono provviste, a seconda della complessità della loro architettura di uno o più ingressi predisposti per ricevere il segnale di richiesta di interruzione da parte della periferica.

Il flow chat che segue descrive le varie fasi che seguono la richiesta di interruzione.

Sistema a microprocessore

periferica

interruzione

47

L’ interruzione non viene servita immediatamente ma solo alla fine della fase di esecuzione dell’istruzione in corso, prima quindi che inizi la fase di fetch dell’istruzione successiva. 1. viene interrogato l’ IF nel registro dei flag per verificare se sono abilitate le interruzioni. 2. viene salvato il contesto ( registri, PC, PSW ). 3. viene riconosciuta l’interruzione, cioè quale periferica l’ha inviata e quindi viene prelevato in un’opportuna zona di memoria l’indirizzo della ISR ( interrupt service routine ) associata al dispositivo. 4. viene eseguita la ISR associata al dispositivo. 5. viene quindi ripristinato il contesto, cioè vengono ricaricati i registri salvati in precedenza. Fra i registi vi è il PC ( program couter ) che sappiamo contenere l’indirizzo dell’istruzione successiva, di conseguenza viene ripresa l’esecuzione del programma originario, all’istruzione seguente a quella durante la cui esecuzione è arrivata l’interruzione. Il problema dell’interruzione è che oltre il tempo necessario alla gestione dell’I/O abbiamo anche i tempi relativi al salvataggio e al ripristino del contesto. Questi tempi sono piccoli ma in presenza di molte interruzioni con grosse quantità di dati possono “pesare” notevolmente. DMA (Direct Memory Access – accesso diretto in memoria) Nella tecnica DMA la periferica richiede alla CPU il controllo dei BUS per gestire in modo autonomo, senza cioè l’intervento del microprocessore, il trasferimento dei dati con le memorie. In pratica nella tecnica DMA un dispositivo di supporto, detto DMA controller, regola il flusso dei dati dalla periferica alla memoria e viceversa. La tecnica DMA è utilizzata quando bisogna gestire i trasferimenti di blocchi di dati ad alta velocità perché, a differenza di quelli gestiti da programma, non sono necessarie operazioni di lettura e scrittura.

48

Microcontrollori e PLC Con il termine microcontrollore si intende comunemente un sistema a microprocessore integrato su un unico chip, che comprende, oltre alla CPU, una memoria di programma, solitamente EPROM o EEPROM, una memoria RAM, generalmente di dimensioni ridotte, per i risultati intermedi dell'elaborazione e per lo stack e periferici di I/O vari (porte seriali ,contatori, timer, convertitori analogico digitali ecc.); per quanto appena esposto questi circuiti integrati vengono anche detti microcomputer single chip. Con queste caratteristiche, dovrebbe essere evidente che i microcontrollori sono stati concepiti soprattutto per applicazioni industriali di controllo, in cui il programma di gestione, una volta messo a punto non ha più necessità di essere modificato (o di esserlo raramente). Sono le applicazioni che gli americani chiamano “embedded”, cioè incorporate in prodotti e apparati finiti, che possono andare dagli elettrodomestici intelligenti, ai sistemi di comunicazione o sicurezza, alla strumentazione, all'automazione in campo automobilistico, ecc In questo senso si vogliono qui ricordare ad alcuni microcontrollori particolarmente diffusi quali la famiglia PIC (il 16C84 costituisce importante elemento delle PlayStation), la famiglia ST o le famiglie prodotte da Motorola, Siemens, Atmel e da diversi altri importanti produttori che hanno progettato e realizzati microcontrollori dedicati a loro applicazioni. I microcontroller PIC (acronimo per Programmable. Integrated Controller) si distaccano dalla struttura di un microprocessore classico, essenzialmente perché sono delle CPU RISC ( Reduced Instruction Set Computing, elaborazione con insieme di istruzioni ridotto) basate su una struttura del tipo Harward (dall'Università dove è stata sviluppata), che si distingue dalla macchina di Von Neuman classica per avere memoria programma e memoria dati (e relativi bus) separati. La filosofia RISC consiste sostanzialmente nel prevedere poche e semplici istruzioni, tutte della stessa lunghezza e (possibilmente) tutte richiedenti lo stesso numero di cicli macchina sta per il fetch che per l'esecuzione. Questa caratteristica unita alla separazione fisica dei canali lungo cui fluiscono istruzioni e dati, permette di ottenere una sovrapposizione (Pipelining) delle fasi di Fetch di un'istruzione con quella di esecuzione della precedente “senza buchi" e quindi in modo molto più efficiente di quello che, per esempio, si ha in termini di velocità complessiva dell'elaborazione nei microprocessori della Famiglia 8086, dove istruzioni diverso hanno tempi diversi sia di fetch che di esecuzione. Da un punto di vista delle applicazioni di potenza in impianti industriali e civili hanno avuto larga diffusione i PLC, Controllori Logici Programmabili, che al pari dei microcontrollori hanno la caratteristica della semplice riprogrammabilità per ottenere le più svariate funzioni attraverso le linee (in genere a 24 (v) ed in numero variabile da modello a modello) di segnali I/O. Il linguaggio assembler 8086

C P U

bus indirizzi

bus dati

R / W

memoria

DMA controller Interfaccia

di I/O periferica

49

Caratteristiche del processore Intel 8086 I processori Intel Tutta la famiglia dei processori Intel (x86) si basa ed e' compatibile con il primo processore di questo tipo: l'8086. 8080 (1974) • CPU a 8 bit, 6000 tr., 2MHz, 64KB di memoria indirizzabile; 8086 (1978) e 8088 (1979) • CPU a 8 bit, 29000 tr., 5-10MHz, 1MB di memoria indirizzabile; • bus a 16 bit (8086) o a 8 bit (8088); • scelta da IBM come CPU per il PC IBM originale. 80286 (1982) • 16 bit, 134'000 tr., 8-12MHz, 16MB memoria indirizzabile; • instruction set di base uguale a 8086 e 8088; • organizzazione di memoria differente, ma complessa per garantire la compatibilità con i vecchi chip. I processori Intel a 32 bit 80386 (1985) • 32 bit, 275’000 tr., 16-33MHz, 4GB memoria indirizzabile; • compatibile con quanto prodotto dall’8080 in poi. 80486 (1989) • 32 bit, 1.2M tr., 25-100MHz, 4GB memoria indirizzabile; • organizzazione a pipeline; • comprende un’unità floating point e 8KB di cache su chip. La CPU INTEL 8086: Microprocessore per scopi generali a 16 bit.Le caratteristiche principali sono: • Address bus a 20 bit quindi avremo una capacità di indirizzamento di 220 = 1 MB • 14 registri interni da 16 bit • data bus a 16 bit • 7 modi di indirizzamento • Set di istruzioni esteso (CISC)

50

Memoria principale • con 20 linee del bus indirizzi avremo 220 = 1.048.5761 = 1 MB locazioni di memoria di 8 bit • il primo byte ha indirizzo 0 • l'ultimo byte ha indirizzo FFFFFH Accesso a 4 blocchi di memoria di 64k byte ciascuno (segmenti) La CPU La CPU è costituita da due blocchi funzionali: • Execution Unit (EU):

- esegue le istruzioni ( fase di execute ) • Bus Interface Unit (BIU):

- preleva le istruzioni ( fase di fetch ) - legge gli operandi - scrive i risultati

51

Execution Unit I principali compiti della EU sono : • eseguire le istruzioni • fornire dati e indirizzi al BIU • modificare registri generali e registro flag Al suo interno trovimo l’ ALU ( Unità Logico Aritmetica ), registri e bus interno a 16 bit L’ EU non ha connessioni dirette con il bus di sistema (con l’esterno) Quando l'EU deve eseguire una nuova istruzione, la ottiene dalla coda gestita dal BIU e se la coda è vuota si pone in attesa; Se un'istruzione richiede di accedere alla memoria o a una periferica, EU richiede a BIU di ottenere o memorizzare il dato; Indirizzi manipolati dall'EU sono di 16 bit Il BIU effettua le operazioni che permettono di accedere all'intero spazio di memoria disponibile Bus Interface Unit La BIU segue tutte le richieste dell'EU che coinvolgono il mondo esterno, cioè i trasferimenti di dati tra la CPU e la memoria o i dispositivi di I/O • calcola gli indirizzi reali a 20 bit sommando, l'indirizzo del segmento e l'offset (entrambi a 16 bit) • esegue trasferimento dati da e verso l'EU • carica le istruzioni nella coda di istruzioni ( prefetch ) Le istruzioni caricate dal BIU nella coda sono quelle che seguono l'istruzione correntemente in esecuzione nell'EU. Se l'EU esegue un'istruzione di salto, il BIU svuota la coda e comincia a riempirla di nuovo a partire dal nuovo indirizzo; in questo caso, l'EU deve aspettare che la BIU abbia acquisito la nuova istruzione da eseguire. I Registri I registri si suddividono in : Registri Generali

52

Sono 4 registri a 16 bit, quindi il microprocessore ha un parallelismo uguale a 16 loro nomi sono: AX., BX, ex, DX. Come si può vedere dalla figura in basso, scrivendo nelle istruzioni AX, BX, CX o DX, si referenziano tutti i 16 bit; scrivendo AH, BH, CH, DH oppure AL, BL, CL, DL, vengono indirizzati rispettivamente gli 8 bit più significativi o gli 8 bit meno significativi del corrispondente registro. Il registro AX, oltre che come accumulatore, viene coinvolto automaticamente in altre operazioni, come la moltiplicazione e la divisione, e anche nelle istruzioni di input e output verso le periferiche come vedremo più avanti. Il registro BX viene anche utilizzato come indice di un vettore o come base di una tabella. Il registro CX viene utilizzato anche come contatore a 16 bit in particolari istruzioni, per esempio nelle istruzioni di LOOP. Il registro DX viene utilizzato anche nelle operazioni di moltiplicazione per contenere la parte più significativa di un prodotto o nelle divisioni per contenere il valore del resto. Viene utilizzato anche nelle istruzioni di IN e OUT per indicare il port relativo alla periferica e in molte chiamate al sistema operativo DOS. Registri Indice e Puntatore Ci sono 4 registri a 16 bit, detti registri indice, utilizzati per gestire i vettori e i record e per implementare le routine di gestione dello stack. Come si può vedere dalla figura, in questi registri si possono referenziare solamente tutti i 16 bit. Il registro SP indica le prime locazioni disponibili nello stack. Il registro BP permette la gestione di uno stack come se fosse un vettore per gestire i parametri quando si usano le procedure. I registri SI e DI sono utilizzati per implementare i vettori. Vengono coinvolti implicitamente nelle istruzioni di gestione delle stringhe: SI indica la stringa sorgente e DI la stringa destinazione.

Registri di Sistema ( IP e FLAGS ) Instruction Pointer (IP)

53

E’ un registro a 16 bit gestito dal BIU contiene, in ogni istante, l'offset (cioè la distanza in byte) dell'istruzione successiva dall'inizio del segmento codice corrente ( CS ). I programmi non hanno accesso diretto all'IP, ma le istruzioni lo modificano implicitamente. Il program counter classico PC coincide con CS:IP. Flags

Registro a 16 bit contenente: • 6 flag di stato: vengono modificati dall'EU in base al risultato delle operazioni logiche e aritmetiche • 3 flag di controllo: settati o azzerati dal programma al fine di modificare il comportamento della CPU In particolare i 9 flag sono : Flag di segno ( SF ) Il flag viene settato ( posto a 1) se il segno del risultato dell’ultima istruzione eseguita è negativo resettato ( posto a 0 ) se è positivo. Flag di Parità ( PF ) Questo flag è settato ( posto a 1) se la somma di bit di valore 1 di un dato è pari, resettato ( posto a 0 ) quando il somma è dispari Flag di Zero ( ZF ) Il flag viene settato ( posto a 1) se il risultato dell’ultima istruzione eseguita è zero resettato ( posto a 0 ) se è diverso da zero. Flag di Overflow ( OF ) Il flag viene settato ( posto a 1) se il risultato dell’ultima istruzione eseguita ha dato overflow, altrimenti è resettato ( posto a 0 ). Flag di Carry ( CF ) Questo flag viene settato se dall'esecuzione di un'istruzione di addizione, risulta un riporto ( carry ), o se in una sottrazione risulta un prestito ( borrow ) . In case contrario il flag è resettato. Flag di Auxiliary carry ( AF ) Esso opera in modo analogo al flag di carry, ma viene usato per indicare un riporto dal bit 3 2-: bit 4 in una somma a 8 bit o un prestito dal bit 4 al bit 3 in una sottrazione a 8 bit. Questo flag era utilizzato nei precedenti processori, nei quali l'input e l' output veniva fatte direttamente dal microprocessore per controllare gli eventuali errori di trasmissione e ricezione. Nella comunicazione seriale asincrona il codice a controllo di peso è usato come codìce a rilevazione d'errore: esso è più conosciuto come codice a controllo di parità Flag di Interrupt enable ( IF ) Esso viene resettato per disabilitare le interruzioni settato per abilitarle. Il flag IF è controllato dalle istruzioni STI ( Set Interrupt ) e CLI ( Clear Interrupt ). Flag di Direction ( DF )

54

Le istruzioni di stringa sono le istruzioni che terminano per S, come MOVS, SCAS, CMPS, STOS e così via: esse servono, per esempio, per copiare un certo numero di locazioni da una zona ad un'altra della memoria oppure per confrontare due zone di memoria. Il flag di direzione viene usato per indicare la direzione secondo la quale queste istruzioni agiscono, in accordo con gli indirizzi di memoria contenuti nei registri SI e DI. Il flag è resettato per stringhe che si stanno elaborando nella direzione della memoria per indirizzi crescenti e settato per stringhe in elaborazione per indirizzi decrescenti di memoria. Flag di Trap ( TF ) Questo flag viene settato quando si vuole eseguire un programma passo passo (step by step), cioè si vuole imporre al microprocessore di passare il controllo all'utente dopo l'esecuzione di ogni istruzione. Registri di Segmento Questi registri contengono in ogni momento l’indirizzo dei 4 segmenti utilizzati in quel particolare momento. La figura illustra i registri di segmento: 15 0 CS registro segmento di Codice DS registro segmento di Dati SS registro segmento di Stack CS registro Extra segmento

Il microprocessore vede la memoria suddivisa in segmenti di 64KB: per poter accedere ad una locazione di memoria abbiamo bisogno del numero di segmento in cui si trova questa locazione e della sua posizione relativa al segmento (offset). Pertanto, quando si fa riferimento ad un'area di memoria, occorre fornire sia il valore del segmento che il displacement ( distanza dal primo indirizzo del segmento ). L'indirizzo del segmento è contenuto in uno dei registri di segmento relativo all'area che si sta referenziando e precisamente: il registro CS indica la base del segmento di memoria in cui sono state allocate le istruzione del programma ( codice ); il registro DS indica la base del segmento in cui sono stati allocati i dati (nell'ordine, dal byte meno significativo a quello più significativo); il registro SS indica la base del segmento gestito come area di stack, utile per implementare le routine con il relativo passaggio di parametri. Al contenuto del registro di segmento occorre aggiungere o il contenuto dell’IP o quello dell’ SP: • l' offset che è fornito dal registro IP, se si deve referenziare un'istruzione o un dato; • il registro SP se usiamo istruzioni che gestiscono lo stack. Il registro ES è un segmento Extra per i dati, quindi possiamo accedere direttamente a due segmenti per i dati. In realtà viene usato nelle istruzioni che fanno riferimento alle stringhe e spesso referenzia la stessa area dati referenziata dal registro DS. Il microprocessore 8088/8086 esegue le istruzioni sequenzialmente a meno che l'istruzione stessa (come nel caso di istruzioni di salto) non interrompa questa sequenzialità. Per ragioni di compatibilità con i precedenti processori, aventi il bus indirizzo a 16 bit, il calcolo dell’ indirizzo effettivo ( EA ) è fatto all'interno del microprocessore tramite la seguente formula:

EA = Segmento *16 + Offset La formula fa riferimento al microprocessore 8088/8086 che ha un bus indirizzo a 20 bit, cioè può indirizzare fino ad 1 MB di memoria fisica ( 220 = 210 x 210 = 1024KB = 1 MB ). Il segmento lungo 16 bit, moltiplicato per 16, viene trasformato in 20 bit ( moltiplicare per 16 = 24 è in sostanza shiftare il numero binario di 4 posizioni a sinistra ) aggiungendo come parte meno significativa 4 bit di valore 0 e sommando quindi il relativo offset, anch' esso di 16 bit. Per esempio si supponga di avere i seguenti valori: Segmento = FFF0 Offset = EEE0

55

Applicando la formula precedente si ottiene EA = FFF00 + EEE0 = 10EDE0 Stack E’ un’ area di memoria centrale gestita attraverso i registri SS e SP, con un protocollo di tipo LIFO ( Last In First Out ). Una struttura LIFO è tale che l'ultimo elemento che vi è stato depositato è anche il primo che viene ripreso e cancellato. Questo rende lo stack ideale per la memorizzazione "provvisoria" di informazioni che è necessario "parcheggiare" in memoria in attesa che servano in seguito. In memoria possono coesistere più stack, ognuno al massimo di 64kB. Un solo è lo stack corrente individuato dalla coppia SS:SP: • SS contiene l'indirizzo del segmento stack ( Stack Segment ) • SP contiene l'offset del top dello stack ( Stack Pointer ) Sullo stack si opera con due istruzioni: PUSH scrive un nuovo valore ( 2 byte per volta ) in testa allo stack POP legge e quindi elimina dallo stack il valore in testa. Lo SP indica sempre l'ultimo elemento dello stack, cioè l'indirizzo in memoria dell'ultimo valore che vi è stato immesso. Ogni volta che viene eseguita una PUSH la CPU fa automaticamente, nell'ordine, le seguenti operazioni: 1 - Aggiornamento dell’ SP che assume il valore giusto per poter effettuare la scrittura nello stack 2 – Scrittura del numero che si vuole immettere nello stack all'indirizzo indicato dallo SP. L'operazione POP fa il contrario: 1 – Lettura della locazione di memoria indicata dallo SP 2 – Aggiornamento del valore dello SP Si noti che il valore in memoria dell'elemento "vecchio" dello stack non viene cancellato (da punto 3 a 4 della Figura 2).Questa è un'operazione inutile, che farebbe perdere del tempo e che non serve.Infatti basta spostare lo stack pointer per far sì che, usando le sole operazioni di PUSH e POP, sia impossibile recuperare i valori vecchi. Una successiva PUSH sovrascrive il valore vecchio mentre una POP toglie dallo stack un altro valore, che sta ad un indirizzo diverso. Una cosa interessante è il fatto che lo stack 8086 procede all'indietro. Quando lo stack viene creato SP deve essere inizializzato con un valore alto, poi, ogni volta che viene aggiunto un nuovo elemento allo stack, quel valore viene decrementato. Quindi rivedendo l’operazione di push • SP <- SP – 2 • Scrittura del numero che si vuole immettere nello stack all'indirizzo indicato dallo SP. L'operazione POP : • Lettura della locazione di memoria indicata dall’ SP • SP <- SP + 2

fine stack

inizio stack

fine stack

inizio stack

stack pieno

SS:00

SS:SP

SS:00

SS:SP

stack vuoto

56

Un uso tipico dello stack durante la programmazione corrente è quando finiscono i registri. Poniamo che, per qualsiasi ragione, ci si trovi con tutti i registri impegnati e che essi non possano essere cancellati, perché mantengono numeri che serviranno presto. Se in questa condizione si presenta la necessità di utilizzare un registro per un calcolo la cosa più rapida da fare è memorizzare nello stack il contenuto di un registro che servirà più tardi ed usare quello per il calcolo, poi rileggere dallo stack il vecchio valore, quando serve ancora. L'occasione più importante in cui si usa lo stack, è nelle chiamate alle procedure, anche se lo fa la CPU implicitamente e non il programmatore. Formato delle istruzioni La sintassi di una generica istruzione in linguaggio assembler è : [LABEL :] OPCODE [OPERANDO 1] [ , OPERANDO 2 ] [ ; COMMENTO ] dove LABEL: identifica l’etichetta di una istruzione, e serve per indicare la posizione di una istruzione all’interno di un programma OPCODE : il codice operativo che identifica l’azione che l’istruzione svolge. OPERANDO / I : in numero variabile da 0 a 2 se sono due vanno separati dalla virgola COMMENTO : qualsiasi sequenza di caratteri terminata da un fine-riga Nota : Le parentesi quadre indicano che l’elemento in parentesi può mancare. Le costanti Le costanti possono essere numeriche, carattere e stringhe e si indicano :

binarie: 001101B esadecimali: 72H, 0DH, 0BEACH ( devono iniziare con un numero ) decimali: 13, 13D reali in base 10: 2.345925, 715E-3 stringhe: ’S ’, ’Ciao’

Le variabili Le variabili non sono altro che locazioni di memoria, ed il loro contenuto può variare durante l’esecuzione del programma. L’ assemblatore che usiamo prevede due tipi di variabili: byte, contiene valori numerici da 0 a 255 word, contiene valori numerici da 0 a 65535

db define byte ( 1 byte = 8 bit ) dw define word ( 2 byte = 16 bit )

esempi var1 db ? ; definisce var1 di tipo byte e non la inizializza var2 db 15 ; definisce var2 di tipo byte e le assegna la costante 15 var3 dw ? ; definisce var3 di tipo word e non la inizializza Istruzioni di trasferimento

MOV dest, sorg dest sorg esempio mov al, bl dest e sorg NON possono essere entrambi variabili Istruzioni aritmetiche

57

ADD dest, sorg dest dest + sorg

esempio add al, bl al al + bl

SUB dest, sorg dest dest - sorg esempio sub al, bl al al-bl

MUL sorg ax al * sorg esempio mov al, 5 mul 6 ax al * 6 nel registro ax avremo 5*6=30

DIV divisore al ax / divisore ah resto

esempio mov ax, 20 div 4 al ax / 4 in al il quoziente cioè 5 in ah il resto cioè 0

INC sorg sorg sorg + 1 esempio inc var var var + 1

DEC sorg sorg sorg – 1 esempio dec cx cx cx - 1

Istruzioni logiche

OR dest, sorg dest dest or sorg

AND dest, sorg dest dest and sorg

XOR dest, sorg dest dest xor sorg

NOT dest fa il complemento di tutti i bit di dest Istruzioni di salto

JA JNBE

jump on above jump on not below or equal

salta se CF = 0 e ZF = 0 salta se op1 > op2 Operandi interi senza segno

JB JNAE

Jump on below Jump on not above or equal

salta se CF = 1

salta se op1 < op2 Operandi interi senza segno

JE JZ

Jump on equal Jump on zero

salta se ZF = 1

salta se op1 = op2

JNE JNZ

Jump not Equal Jump not zero

salta se ZF = 0 salta se op1 <> op2

JAE JNB

Jump on above or equal Jump on not below

salta se CF = 0 salta se op1 >= op2 Operandi interi senza segno

JBE JNA

Jump on below or equal Jump on not above

salta se CF = 1 o ZF = 0 salta se CF = 1 o ZF = 1

salta se op1 <= op2 Operandi interi senza segno

58

JG JNLE

Jump on greater Jump on not less or equal

salta se ZF = 0 e SF = 0 salta se op1 > op2 Operandi interi con segno

JGE JNL

Jump on greater or equal Jump on not less

salta se SF = OF salta se op1 >= op2 Operandi interi con segno

JL JNGE

Jump on less Jump on not greater or equal

salta se SF <> OF salta se op1 < op2 Operandi interi con segno

JLE JNG

Jump on less or equal Jump on not greater

Salta se ZF = 1 o SF<>OF

salta se op1 <= op2 Operandi interi con segno

Istruzioni di confronto

CMP op1, op2 ; op1 > op2 ?

I due operandi vengono confrontati, senza essere modificati, quindi vengono modificati i bit ZF, SF, CF, PF, OF, AF del registro dei flag., di conseguenza possono essere usate le istruzioni di salto condizionato al valore assunto da questi flag. Realizzazione della selezione ( if )

cmp op1, op2 ; se è vero che op1 > op2 ja then ; allora salta a then

else : ……………… ; altrimenti esegui le istruzioni ……………… ; che seguono ja

jmp fine then : ………………

……………… fine : ……………… Realizzazione del ciclo

• ciclo do ... while

59

inizio : …………. ; istruzioni del ciclo ………….

cmp op1,op2 ; se op1 = op2 je inizio ; allora resta nel ciclo

fine : ; altrimenti esci dal ciclo • ciclo while

inizio : cmp op1, op2 ; se op1 = op2

je fine ; allora vai a fine ed esci dal ciclo ……….. ; altrimenti esegui le istruzioni del ciclo ……….. jmp inizio

fine: ………. ; resto del programma Interfacciamento con l’utente • Visualizzazione di un carattere mov dl, codice ASCII carattere mov ah, 02h int 21h Esempio : visualizza carattere (>) mov dl, ’>’ mov ah, 02h int 21h • Inserimento di un carattere da tastiera mov ah, 01h int 21h il valore del tasto premuto viene messo in al se si tratta di una cifra e la si deve elaborare come tale allora : sub al ,48 prima di stampare una cifra : add al ,48 Es. - mov ah,01h int 21h in al avremo il codice ASCII del valore del tasto premuto Istruzioni di scorrimento e rotazione

SAL operando, n ( shift arithmetic left ) shift a sinistra di un numero con segno di n posizioni

60

SAR operando, n

( shift arithmetic right ) shift a destra di un numero con segno di n posizioni

SHL operando, n

( shift logical left ) shift a sinistra di un numero senza segno di n posizioni

SHR operando, n

( shift logical right ) shift a destra di un numero senza segno di n posizioni

ROL operando, n

( rotate left ) esegue la rotazione verso sinistra dei bit dell’operando di n posizioni. Rispetto alla RCL non attraversa il bit di carry, ma mantiene in esso la copia del bit estratto

ROR operando, n ( rotate rightleft ) esegue la rotazione verso destra dei bit dell’operando di n posizioni. Rispetto alla

RCR non attraversa il bit di carry, ma mantiene in esso la copia del bit estratto

RCL operando, n ( rotate througth carry left ) esegue la rotazione verso sinistra dei bit dell’operando di n posizioni

attraverso il flag di carry

RCR operando, n

( rotate througth carry left ) esegue la rotazione verso destra dei bit dell’operando di n posizioni attraverso il flag di carry

Vettori

Un vettore o array è un insieme di elementi dello stesso tipo ( db o dw ). Ciascun elemento è individuabile attraverso il nome dell’array e dalla sua posizione ( indice ).

61

Definizione: nome_vettore db elem1, elem2,…, elemN esempio a db 48h, 65h, 6Ch, 6Ch, 6Fh, 00h b db 'Hello', 0

Gli elementi di un vettore partono dalla posizione ( indice ) 0.

Si può accedere al valore di un elemento dell’array usando le parentesi quadre, per esempio: MOV AL, a[3] Si possono usare i registri BX, SI, DI, BP, per esempio: MOV SI, 3 MOV AL, a[SI] Se si devono dichiarare array di grandi dimensionji con valori DUPlicati potremo usare la DUP: Definizione: nome_vettore db N dup ( elem1, elem2,…, elemN )

N è il numero di duplicati da creare ( solo valori costanti ). elem1, elem2,…, elemN sono le espressioni che la DUP deve duplicare. per esempio: c DB 5 DUP ( 9 ) equivale a c DB 9, 9, 9, 9, 9 d DB 5 DUP( 1, 2 ) equivale a d DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 num db 8 dup ( ? ) gli 8 elementi non vengono inizializzati Uso dei vettori: per lavorare con i vettori si usa il metodo di indirizzamento indiretto indicizzato, e precisamente - si carica l’offset del vettore ( indirizzo di partenza del vettore rappresentato dal suo nome ) in ‘bx’. L’istruzione utilizzata è la LEA ( load estended address ) - si azzera uno dei registri indice ‘di’ o ‘si’ - si tratta l’elemento di-esimo del vettore con il formalismo [ bx + di ], cioè [ bx+di ] è l’elemento di-esimo - il formalismo appena visto richiede che [bx+di] sia preceduto da un riconoscimento del tipo di vettore su cui si sta lavorando,tipo byte o word,quindi a seconda dei casi si scriverà:

byte ptr [ bx+di ] o word ptr [ bx+di ] - ricordate che i registri hanno compiti specifici e quindi devono essere usati come indicato

bx = registro base di e si = registri indice Perciò con riferimento all’esempio precedente: ; stampa degli elementi del vettore vett

vett DB 2, 4, 6 , 7, 10 lea bx, vett

62

mov di, 0000h ciclo : cmp di, 0005h je fine mov dl, byte ptr [ bx+di ] mov ah, 01h int 21h inc di jmp ciclo fine : hlt Per il caricamento del vettore invece, basta far inserire il carattere e salvarlo nel vettore invece che in

una variabile, naturalmente il tutto sarà gestito di nuovo con un ciclo.

Stringhe

Le stringhe in assembler come in ogni altro linguaggio non sono altro che vettori di caratteri e quindi possono essere trattate come tali. • Definire una stringa significa quindi definire un vettore di caratteri terminante con 0 ( = 00h = fine stringa). Osservazione: la stringa può avere una lunghezza minore di quella dichiarata, ma non può superarla. definizione: nome_stringa db N dup ( 00h ) esempio edificio db 10 dup ( 00h ) lo 00h sta per ‘stringa vuota, non inizializzata’ se vogliamo inizializzare la stringa nome_stringa db ’contenuto stringa’ , N dup ( 00h )

edificio db ‘casa’ 6 DUP ( 00H ) 0 1 2 3 4 5 6 7 8 9

c a s a 00h 00h 00h 00h 00h 00h edificio db 0A, 0D, ‘casa’ 4 DUP ( 00H ) 0 1 2 3 4 5 6 7 8 9

0A 0D c a s a 00h 00h 00h 00h OA nella tavola ASCII corrisponde al LF ( Line Feed – vai a capo ), 0D corrisponde al CR ( carriage return - ritorno carrello ). Se dovessimo stampare questa stringa otterremmo visivamente prima della scritta casa un’andata a capo.

• Trattamento delle stringhe: il trattamento di stringhe definite in questo modo sarà identico a quello di un normale vettore

- inserimento: sarà costituito da un ciclo che sposterà ogni carattere inserito nel vettore-stringa e che terminerà con la pressione di INVIO, bisognerà quindi ricordarsi di sostituire quest’ultimo con 00h - stampa: sarà costituita da un ciclo che inizierà dalla 1°cella (byte 0) e terminerà quando il contenuto della L-esima cella sarà 00h Nota: per andare a capo prima o dopo la stringa,si dovrà aggiungere dove necessario questo tratto di codice:

63

mov dl,0Dh ; stampa Carriage Return mov ah, 02h int 21h mov dl, 0Ah ; stampa Line Feed mov ah, 02h int 21h Sottoprogrammi

In assembler non esiste una distinzione fra procedure e funzioni, si chiamano tutte procedure. Le istruzioni da usare sono : nome_ procedura PROC; per dichiararla a fine programma, prima dell’ end

………… ………… RET nome_procedura ENDP CALL nome_procedura ; per per chiamare una procedura esempio : … CALL somma … mov ah,4Ch mov al,00h int 21h somma PROC … RET somma ENDP end • Passaggio dei parametri Ci sono vari metodi per passare i parametri alle procedure, il più usato è quello che sfrutta lo STACK, per ora utilizzeremo i registri che tratteremo come variabili globali cioè che sono “viste” al ogni livello ( main e procedure ) e quindi referenziate ( lette o scritte ) ad ogni livello. Macroistruzioni Le macro sono apparentemente simili alle procedure, nel senso che vengono utilizzate quando un gruppo di istruzioni del nostro programma deve essere ripetuto più volte, ma mentre per le procedure le istruzioni sono uniche e vengono ‘richiamate’ all’occorrenza ( quindi ottimizzo lo spazio di memoria ), nelle macro in fase di traduzione del programma la chiamata viene sostituita con le istruzioni che compongono la macro ( ottimizzo il tempo di esecuzione ). La sintassi per definire una macro è : Nome_macro MACRO …….. …….. …….

64

ENDM Per fare riferimento alla macro basta specificarne il nome, come per le procedure. Le costanti simboliche - direttiva EQU Una costante simbolica, è una costante ( non varia durante l’esecuzione del programma ) simbolica perché faremo riferimento ad essa usando un identificatore come per le variabili. Per esempio k EQU 5 definisce una costante simbolica k di valore 5 mov k, 7 non è valida perché K è una costante MASCHERAMENTO Per mascheramento di una variabile o registro intendiamo una tecnica attraverso la quale isolare, per poter modificare o valutare, uno o più bit della variabile o del registro. Nella tabella che segue sono elencati i principali casi:

come si fa per : realizzazione in C/C++ realizzazione in assembler

Valutare il valore del quinto bit di a

if ( a & 0x20 ) cout << “ il bit 5 è settato “; else cout << “ il bit 5 è resettato “;

MOV al, a AND al, 020h JZ label1 ( salta se quinto bit = 0 ) JNZ label2 ( salta se quinto bit = 1 )

settare ( poni a 1 ) il quarto bit di a a = a | 0x10; OR a, 010h

Resettare ( poni a 0 ) il quarto bit di a

a = a & 0xEF oppure a = a & ( ~0x10 ) AND a, 0EFh

invertire il valore del settimo bit di a

a = a ^ 0x80 XOR a, 080h

65

66

IL SET DI ISTRUZIONI DEL MICROPROCESSORE 8086 Simboli di identificazione dei flag

O flag di overflow D flag di direzione I flag di interrupt T flag di trap S flag di segno Z flag di zero A flag di ausiliario P flag di parità C flag di carry

Simboli di identificazione del valore dei flag 0 valore del flag pari a zero 1 valore del flag pari a uno ? valore del flag indeterminato * valore del flag che riflette il risultato dell’operazione - valore del flag non modificato Simboli di identificazione del tipo degli operandi r registro (a 8 o a 16 bit) rel indirizzo relativo in memoria ptr puntatore in un segmento di codice differente da quello dell’istruzione im valore immediato (costante) a 8 o a 16 bit r/m registro o area di memoria m area di memoria (a 8 o a 16 bit) Sreg registro di segmento

67

Istruzioni Significato O D I T S Z A P C

AAA regolazione BCD dopo ADD ? - - - ? ? * ? * AAD regolazione BCD prima di DIV ? - - - * * ? * ? AAM regolazione BCD dopo MUL ? - - - * * ? * ? AAS regolazione BCD dopo SUB ? - - - ? ? * ? * ADC r/m8,r8 somma con riporto a 8 bit * - - - * * * * * ADC r8,r/m8 somma con riporto a 8 bit * - - - * * * * * ADC r/m8,im8 somma con riporto a 8 bit * - - - * * * * * ADC r/m16,r16 somma con riporto a 16 bit * - - - * * * * * ADC r16,r/m16 somma con riporto a 16 bit * - - - * * * * * ADC r/m16,im8 somma con riporto a 16 bit * - - - * * * * * ADC r/m16,im16 somma con riporto a 16 bit * - - - * * * * * ADD r/m8,r8 somma a 8 bit * - - - * * * * * ADD r8,r/m8 somma a 8 bit * - - - * * * * * ADD r/m8,im8 somma a 8 bit * - - - * * * * * ADD r/m16,r16 somma a 16 bit * - - - * * * * * ADD r16,r/m16 somma a 16 bit * - - - * * * * * ADD r/m16,im8 somma a 16 bit * - - - * * * * * ADD r/m16,im16 somma a 16 bit * - - - * * * * * AND r/m8,r8 AND logico a 8 bit 0 - - - * * ? * 0 AND r8,r/m8 AND logico a 8 bit 0 - - - * * ? * 0 AND r/m8,im8 AND logico a 8 bit 0 - - - * * ? * 0 AND r/m16,r16 AND logico a 16 bit 0 - - - * * ? * 0 AND r16,r/m16 AND logico a 16 bit 0 - - - * * ? * 0 AND r/m16,im8 AND logico a 16 bit 0 - - - * * ? * 0 AND r/m16,im16 AND logico a 16 bit 0 - - - * * ? * 0 CALL rel16 chiamata di procedura CALL r/m16 chiamata con ind. Indiretto CALL ptr16:16 chiamata in intersegmento CALL m16:16 chiamata indiretta intersegmento CBW conversione byte-word - - - - - - - - - CLC azzeramento del carry - - - - - - - - 0 CLD azzeramento del flag di direzione - 0 - - - - - - - CLI azzeramento del flag di interrupt - - 0 - - - - - - CMC complemento del flag di carry - - - - - - - - * CMP r/m8,r8 confronto a 8 bit * - - - * * * * * CMP r8,r/m8 confronto a 8 bit * - - - * * * * * CMP r/m8,im8 confronto a 8 bit * - - - * * * * * CMP r/m16,r16 confronto a 16 bit * - - - * * * * * CMP r16,r/m16 confronto a 16 bit * - - - * * * * * CMP r/m16,im8 confronto a 16 bit * - - - * * * * * CMP r/m16,im16 confronto a 16 bit * - - - * * * * * DAA regolazione decimale dopo add ? - - - * * * * * DAS r8,r/m8 regolazione decimale dopo sub ? - - - * * * * * DEC r/m8 decremento a 8 bit * - - - * * * * - DEC r/m16 decremento a 16 bit * - - - * * * * - DIV r/m8 divisione senza segno

AL <- AX / r o m8 AH <- resto della divisione

? - - - ? ? ? ? ?

DIV r/m16 divisione senza segno AX <- DX:AX / r o m16 DX <- resto della divisione

? - - - ? ? ? ? ?

HLT Alt - - - - - - - - - r/m8 divisione con segno ? - - - ? ? ? ? ? IDIV r/m16 divisione con segno ? - - - ? ? ? ? ? IMUL r/m8 moltiplicazione con segno * - - - ? ? ? ? * Istruzioni Significato O D I T S Z A P C IMUL r/m16 moltiplicazione con segno * - - - ? ? ? ? *

68

IN AL,im8 input da porta indirizzata - - - - - - - - - IN AX,im8 input da porta indirizzata - - - - - - - - - IN AL,DX input da porta indirizzata - - - - - - - - - IN AX,DX input da porta indirizzata - - - - - - - - - INC r/m8 Incremento * - - - * * * * - INC r/m16 Incremento * - - - * * * * - INT im8 chiamata di interrupt - - 0 0 - - - - - INTO chiamata int 4 se O=1 - - 0 0 - - - - - IRET ritorno dall'interrupt * * * * * * * * * JA rel salto se C=0 eZ=0 - - - - - - - - - JAE rel salto se C=0 - - - - - - - - - JB rel salto se C=1 - - - - - - - - - JBE rel salto se C=1 o Z=0 - - - - - - - - - JC rel salto se C=1 - - - - - - - - - JCXZ rel salto se CX=0 - - - - - - - - - JE rel salto se Z=1 - - - - - - - - - JG rel salto se Z=0 e S=O - - - - - - - - - JGE rel salto se S=0 - - - - - - - - - JL rel salto se S≠0 - - - - - - - - - JLE rel salto se Z=1 o S≠0 - - - - - - - - - JNA rel salto se C=1 o Z=1 - - - - - - - - - JNAE rel salto se C=1 - - - - - - - - - JNB rel salto se C=0 - - - - - - - - - JNBE rel salto se C=0 e Z=0 - - - - - - - - - JNC rel salto se C=0 - - - - - - - - - JNE rel salto se Z=0 - - - - - - - - - JNG rel salto se Z=1 o S≠O - - - - - - - - - JNGE rel salto se S≠0 - - - - - - - - - JNL rel salto se S=O - - - - - - - - - JNLE rel salto se Z=0 e S=0 - - - - - - - - - JNO rel salto se O=0 - - - - - - - - - JNP rel salto se P=0 - - - - - - - - - JNS rel salto se S=0 - - - - - - - - - JNZ rel salto se Z=0 - - - - - - - - - JO rel salto se O=1 - - - - - - - - - JP rel salto se P=1 - - - - - - - - - JPE rel salto se P=1 - - - - - - - - - JPO rel salto se P=0 - - - - - - - - - JS rel salto se S=1 - - - - - - - - - JZ rel salto se Z=1 - - - - - - - - - JMP rel salto incondizionato - - - - - - - - - JMP r/m16 salto incondizionato - - - - - - - - - JMP ptr salto incondizionato - - - - - - - - - JMP m16:16 salto incondizionato - - - - - - - - - LAHF carica i flag in AH (SZxAxPxC) - - - - - - - - - LEA r16,M carica l'indirizzo di offset nel registro - - - - - - - - - LODS m8 caricamento di stringhe byte per byte - - - - - - - - - LODS m16 caricamento di stringhe word per word - - - - - - - - - LODSB caricamento di stringhe byte per byte - - - - - - - - - LODSW caricamento di stringhe word per word - - - - - - - - - LOOP rel decremento di CX e salto se CX≠0 - - - - - - - - - LOOPE rel decremento di CX e salto se CX≠0 e

Z=1 - - - - - - - - -

69

Istruzioni Significato O D I T S Z A P C LOOPNE rel decremento di CX e salto se CX≠0 e

Z=0 - - - - - - - - -

LOOPNZ rel decremento di CX e salto se CX≠0 e Z=0

- - - - - - - - -

LOOPZ rel decremento di CX e salto se CX≠0 e Z=1

- - - - - - - - -

MOV r/m8,r8 spostamento di dati a 8 bit - - - - - - - - - MOV r8,r/m8 spostamento di dati a 8 bit - - - - - - - - - MOV r/m8,im8 spostamento di dati a 8 bit - - - - - - - - - MOV r/m16,r16 spostamento di dati a 16 bit - - - - - - - - - MOV r16,r/m16 spostamento di dati a 16 bit - - - - - - - - - MOV r/m16,im16 spostamento di dati a 16 bit - - - - - - - - - MOV Sreg,r/m16 spostamento di dati a 16 bit - - - - - - - - - MOV r/m16,Sreg spostamento di dati a 16 bit - - - - - - - - - MOVS m8, m8 spostamento tra stringhe byte per byte - - - - - - - - - MOVS m16,m16 spostamento tra stringhe word per

word - - - - - - - - -

MOVSB spostamento tra stringhe byte per byte - - - - - - - - - MOVSW spostamento tra stringhe word per

word - - - - - - - - -

MUL r/m8 moltiplicazione senza segno AX <- AL * r/m8

* - - - ? ? ? ? *

MUL r/m16 moltiplicazione senza segno DX:AX <- AX * r/m16

* - - - ? ? ? ? *

NEG r/m8 complemento a 2 a 8 bit * - - - * * * * * NEG r/m16 complemento a 2 a 16 bit * - - - * * * * * NOP operazione nulla - - - - - - - - - NOT r/m inverte tutti i bit dell’operando - - - - - - - - - OR r/m8,im8 OR inclusivo a 8 bit 0 - - - * * ? * 0 OR r/m8,r8 OR inclusivo a 8 bit 0 - - - * * ? * 0 OR r8,r/m8 OR inclusivo a 8 bit 0 - - - * * ? * 0 OR r/m16,im16 OR inclusivo a 16 bit 0 - - - * * ? * 0 OR r/m16,r16 OR inclusivo a 16 bit 0 - - - * * ? * 0 OR r16,r/m16 OR inclusivo a 16 bit 0 - - - * * ? * 0 OUT im8,AL uscita di un byte sulla porta - - - - - - - - - OUT im8,AX uscita di una word sulla porta - - - - - - - - - OUT DX,AL uscita di un byte sulla porta - - - - - - - - - OUT DX,AX uscita di una word sulla porta - - - - - - - - - POP r/m16 estrazione di una word dallo stack - - - - - - - - - POP DS caricamento del Sreg dallo stack - - - - - - - - - POP ES caricamento del Sreg dallo stack - - - - - - - - - POP SS caricamento del Sreg dallo stack - - - - - - - - - POPF caricamento dei flag dallo stack * * * * * * * * * PUSH r/m16 inserimento di una word nello stack - - - - - - - - - PUSH im16 inserimento di una word nello stack - - - - - - - - - PUSH Sreg salvataggio del registro nello stack - - - - - - - - - PUSHF salvataggio dei flag nello stack - - - - - - - - - RCL r/m8,n rotazione a sinistra su 9 bit * - - - - - - - * RCL r/m8,CL rotazione a sinistra su 9 bit ripetuta * - - - - - - - * RCL r/m16,n rotazione a sinistra su 17 bit * - - - - - - - * RCL r/m16,CL rotazione a sinistra su 17 bit ripetuta * - - - - - - - * RCR r/m8,n rotazione a destra su 9 bit * - - - - - - - * RCR r/m8,CL rotazione a destra su 9 bit ripetura * - - - - - - - * RCR r/m16,n rotazione a destra su 17 bit * - - - - - - - * REP MOVS m,m spostamento ripetuto tra stringhe - - - - - * - - - REP OUTS DX,r/m out di stringhe sulla porta - - - - - * - - - REP STOS m Caricamento di stringhe - - - - - * - - - REPE CMPS m,m ricerca dei byte diversi tra stringhe - - - - - * - - - REPE SCAS m8 ricerca nella stringa byte diverso da AL - - - - - * - - - REPE SCAS m16 Ricerca nella stringa word diversa da AX - - - - - * - - -

70

Istruzioni Significato O D I T S Z A P C REPNE CMPS m,m Ricerca byte uguali tra stringhe - - - - - * - - - REPNE SCAS m8 Ricerca nella stringa byte uguale a AL - - - - - * - - - REPNE SCAS m16 Ricerca nella stringa word uguale a AX - - - - - * - - - REPZ CMPS m,m ricerca dei byte diversi tra stringhe - - - - - * - - - REPZ SCAS m8 ricerca nella stringa byte diverso da AL - - - - - * - - - REPZ SCAS m16 ricerca nella stringa word diversa da AX - - - - - * - - - REPNZ CMPS m,m ricerca byte uguali tra stringhe - - - - - * - - - REPNZ SCAS m8 ricerca nella stringa byte uguale a AL - - - - - * - - - REPNZ SCAS m16 ricerca nella stringa word uguale a AX - - - - - * - - - RET ritorno di procedura - - - - - - - - - RET im16 ritorno di procedura con recupero dati - - - - - - - - - ROL r/m16,CL rotazione a destra su 17 bit ripetuta * - - - - - - - * ROL r/m8,n rotazione a sinistra su 8 bit * - - - - - - - * ROL r/m8,CL rotazione a sinistra su 8 bit ripetuta * - - - - - - - * ROL r/m16,n rotazione a sinistra su 16 bit * - - - - - - - * ROL r/m16,CL rotazione a sinistra su 16 bit ripetuta * - - - - - - - * ROR r/m8,n rotazione a destra su 8 bit * - - - - - - - * ROR r/m8,CL rotazione a destra su 8 bit ripetuta * - - - - - - - * ROR r/m16,n rotazione a destra su 18 bit * - - - - - - - * ROR r/m16,CL rotazione a destra su 17 bit ripetuta * - - - - - - - * SAHF caricamento da AH dei FLAG S,Z,F,P e C - - - - * * * * * SAL r/m8,n scorrimento a sinistra su 8 bit * - - - * * ? * * SAL r/m8,CL scorrimento ripetuto a sinistra su 8 bit * - - - * * ? * * SAL r/m16,n scorrimento a sinistra su 16 bit * - - - * * ? * * SAL r/m16,CL scorrimento ripetuto a sinistra su 16 bit * - - - * * ? * * SAR r/m8,n scorrimento a destra su 8 bit * - - - * * ? * * SALR r/m8,CL scorrimento ripetuto a destra su 8 bit * - - - * * ? * * SAR r/m16,n scorrimento a destra su 16 bit * - - - * * ? * * SAR r/m16,CL scorrimento ripetuto a destra su 16 bit * - - - * * ? * * SBB r/m8,im8 sottrazione a 8 bit con riporto negativo * - - - * * * * * SBB r/m8,r8 sottrazione a 8 bit con riporto negativo * - - - * * * * * SBB r/m8,im8 sottrazione a 8 bit con riporto negativo * - - - * * * * * SBB r8,m8 sottrazione a 8 bit con riporto negativo * - - - * * * * * SBB r/m16,im16 sottrazione a 16 bit con riporto negativo * - - - * * * * * SBB r/m16,r16 sottrazione a 16 bit con riporto negativo * - - - * * * * * SBB r/m16,im16 sottrazione a 16 bit con riporto negativo * - - - * * * * * SBB r16,m16 sottrazione a 16 bit con riporto negativo * - - - * * * * * SCAS m8 confronto tra AL e byte di stringa * - - - * * * * * SCAS m16 confronto tra AX e word di stringa * - - - * * * * * SCASB confronto tra AL e byte di stringa * - - - * * * * * SCASW confronto tra AX e word di stringa * - - - * * * * * SHL r/m8,n scorrimento a sinistra su 8 bit * - - - * * ? * * SHL r/m8,CL scorrimento ripetuto a sinistra su 8 bit * - - - * * ? * * SHL r/m16,n scorrimento a sinistra su 16 bit * - - - * * ? * * SHL r/m16,CL scorrimento ripetuto a sinistra su 16 bit * - - - * * ? * * SHR r/m8,n scorrimento a destra su 8 bit * - - - * * ? * * SHLR r/m8,CL scorrimento ripetuto a destra su 8 bit * - - - * * ? * * SHR r/m16,n scorrimento a destra su 16 bit * - - - * * ? * * SHR r/m16,CL scorrimento ripetuto a destra su 16 bit * - - - * * ? * * STC pone a 1 il flag di carry - - - - - - - - 1 STD pone a 1 il flag di direzione - 1 - - - - - - - STI pone a 1 il flag di interrupt - - 1 - - - - - -

71

Istruzioni Significato O D I T S Z A P C STOS m8 caricamento di stringa byte per byte - - - - - - - - - STOS m16 caricamento di stringa word per word - - - - - - - - - STOSB caricamento di stringa byte per byte - - - - - - - - - STOSW caricamento di stringa word per word - - - - - - - - - SUB r/m8,im8 sottrazione a 8 bit * - - - * * * * * SUB r/m8,r8 sottrazione a 8 bit * - - - * * * * * SUB r8,m8 sottrazione a 8 bit * - - - * * * * * SUB r/m16,im16 sottrazione a 16 bit * - - - * * * * * SUB r/m16,r16 sottrazione a 16 bit * - - - * * * * * SUB r16,m16 sottrazione a 16 bit * - - - * * * * * TEST r/m8,im8 confronto logico a 8 bit 0 - - - * * ? * 0 TEST r/m8,r8 confronto logico a 8 bit 0 - - - * * ? * 0 TEST r/m16,im16 confronto logico a 16 bit 0 - - - * * ? * 0 TEST r/m16,r16 confronto logico a 16 bit 0 - - - * * ? * 0 WAIT attesa del segnale BUSY alto - - - - - - - - - XCHG r/m8,r8 scambio a 8 bit - - - - - - - - - XCHG r8,r/m8 scambio a 8 bit - - - - - - - - - XCHG r/m16,r16 scambio a 16 bit - - - - - - - - - XCHG r16,r/m16 scambio a 16 bit - - - - - - - - - XLAT m8 consultazione di tabelle - - - - - - - - - XLAT B consultazione di tabelle - - - - - - - - - XOR r/m8,im8 OR esclusivo a 8 bit 0 - - - * * ? * 0 XOR r/m8,r8 OR esclusivo a 8 bit 0 - - - * * ? * 0 XOR r8,r/m8 OR esclusivo a 8 bit 0 - - - * * ? * 0 XOR r/m16,im16 OR esclusivo a 16 bit 0 - - - * * ? * 0 XOR r/m16,r16 OR esclusivo a 16 bit 0 - - - * * ? * 0 XOR r16,r/m16 OR esclusivo a 16 bit 0 - - - * * ? * 0