00PrPag_HAMACHER_2011 04/12/12 12:01 Pagina VII
Indice
Prefazione
XV
Autori
XX
Ringraziamenti dell’Editore
XXI
Guida alla lettura
XXII
1
Introduzione al calcolatore
1
1.1
Famiglie di calcolatori
1
1.2
Componenti funzionali
1.2.1
Unità di ingresso
1.2.2
Unità di memoria
1.2.3
Unità aritmetica-logica
1.2.4
Unità di uscita
1.2.5
Unità di controllo
2
4
4
5
6
6
1.3
Concetti operativi di base
7
1.4
Rappresentazione dei numeri e operazioni
1.5
1.6
1.7
aritmetiche
1.4.1
Numeri interi
1.4.2
Numeri frazionari
10
10
16
Rappresentazione dei caratteri
17
Approfondimento applicativo 1.1
Codici di controllo e correzione di errore
19
Approfondimento applicativo 1.2
Rappresentazione binaria di informazione multimediale
22
Approfondimento applicativo 1.3
Compressione di dati
24
Considerazioni di efficienza
1.6.1
Tecnologia
1.6.2
Parallelismo
26
26
26
Breve storia del calcolatore
1.7.1
Prima generazione
1.7.2
Seconda generazione
1.7.3
Terza generazione
1.7.4
Quarta generazione
Sommario
Note bibliografiche
27
29
29
30
30
31
31
00PrPag_HAMACHER_2011 04/12/12 12:01 Pagina VIII
VIII Indice
2
Istruzioni macchina
33
2.1
Memoria del calcolatore
2.1.1
Indirizzamento di byte
2.1.2
Ordinamento di byte
Allineamento di parola
2.1.3
2.1.4
Dati numerici e testuali
34
36
36
37
38
2.2
Operazioni di memoria
38
2.3
Istruzioni macchina di base
2.3.1
Trasferimento di registro
2.3.2
Notazione simbolica
2.3.3
Insiemi di istruzioni RISC e CISC
2.3.4
Introduzione agli insiemi di istruzioni RISC
38
39
40
40
41
Approfondimento applicativo 2.1
Architetture di insiemi di istruzioni di processori in commercio: NIOS II,
ColdFire, ARM, IA-32
2.3.5
Esecuzione Sequenziale
2.3.6
Esecuzione con salto
2.3.7
Calcolo di indirizzo
42
44
45
48
Modi di indirizzamento
2.4.1
Costante e variabile
2.4.2
Modo indiretto e puntatore
2.4.3
Modo con indice e vettore
48
49
50
52
Approfondimento applicativo 2.2
Modi di indirizzamento NIOS II, ColdFire, ARM, IA-32
56
Linguaggio assemblativo
2.5.1
Direttive di assemblatore
2.5.2
Assemblaggio ed esecuzione
58
59
62
Approfondimento applicativo 2.3
Direttive di assemblatore e sintassi di GNU Assembler
2.5.3
Notazione per i numeri
63
67
2.6
Gestione di pila
67
2.7
Gestione di sottoprogramma
2.7.1
Annidamento e pila
2.7.2
Passaggio di parametri
2.7.3
Area di attivazione
69
70
71
75
2.8
Altre istruzioni macchina
2.8.1
Istruzioni logiche
80
80
Approfondimento applicativo 2.4
Collegamento di sottoprogrammi, macroistruzioni
2.8.2
Scorrimento e rotazione
2.8.3
Moltiplicazione e divisione
81
83
86
2.9
Trattamento di valori immediati a 32 bit
88
2.10
Insiemi di istruzioni CISC
2.10.1 Altri indirizzamenti
2.10.2 Bit di esito o condizione
89
90
91
2.11
Stili RISC e CISC
93
2.4
2.5
00PrPag_HAMACHER_2011 04/12/12 12:01 Pagina IX
Indice IX
2.12
2.13
3
4
Esempi di programma
2.12.1 Prodotto scalare di vettori
2.12.2 Programma di ricerca di una stringa
94
94
95
Approfondimento applicativo 2.5
Codici operativi e sintassi delle istruzioni
96
Codifica numerica di istruzione
103
Approfondimento applicativo 2.6
Esempi e problemi di programmazione assemblativa
Sommario
Note bibliografiche
104
107
107
Operazioni di ingresso e uscita
109
3.1
Accesso
3.1.1
3.1.2
3.1.3
3.1.4
109
110
111
114
114
3.2
Tecnica di interruzione
116
Approfondimento applicativo 3.1
I/O nei processori NIOS II, ARM, ColdFire e IA-32
3.2.1
Controllo di interruzione
3.2.2
Gestione di dispositivi multipli
3.2.3
Controllo della richiesta
3.2.4
Registri di controllo del processore
3.2.5
Esempi di programmi con interruzioni
3.2.6
Concetto di eccezione
117
122
123
125
126
127
132
Approfondimento applicativo 3.2
I/O con interruzioni NIOS II, ARM, ColdFire, IA-32
134
a dispositivo di I/O
Interfaccia dei dispositivi di I/O
I/O controllati da programma
Un esempio di un programma per I/O in stile RISC
Un esempio di un programma per I/O in stile CISC
Approfondimento applicativo 3.3
Eccezioni nei processori NIOS II, ARM, ColdFire, IA-32
Sommario
139
141
Software
143
4.1
Processo assemblativo
4.1.1
Assemblatore a due passi
143
144
4.2
Caricare ed eseguire programmi oggetto
144
4.3
Il collegatore
145
4.4
Librerie
146
4.5
Il compilatore
4.5.1
Ottimizzazioni del compilatore
4.5.2
Combinare programmi scritti in linguaggi diversi
146
147
147
4.6
Il debugger
147
4.7
Uso di un linguaggio di alto livello per operazioni di I/O
150
4.8
Interazioni tra linguaggio assemblativo e linguaggio C
152
00PrPag_HAMACHER_2011 04/12/12 12:01 Pagina X
X
Indice
4.9
5
6
Sistema operativo
4.9.1
Processo di avvio
4.9.2
Gestione dell’esecuzione di programmi
di applicazioni
4.9.3
Uso delle interruzioni in un sistema operativo
Sommario
Note bibliografiche
157
158
161
161
Struttura di base del processore
163
5.1
Alcuni concetti fondamentali
163
5.2
Esecuzione di istruzioni
5.2.1
Istruzioni di caricamento
5.2.2
Istruzioni aritmetiche e logiche
5.2.3
Istruzioni di immagazzinamento
166
166
167
168
5.3
Componenti hardware
5.3.1
Banco di registri
5.3.2
ALU
5.3.3
Percorso dati
5.3.4
Sezione di prelievo delle istruzioni
169
169
169
171
174
5.4
Prelievo di istruzioni e passi di esecuzione
5.4.1
Salti
5.4.2
In attesa della memoria
176
178
181
5.5
Segnali di controllo
181
5.6
Controllo di tipo cablato
5.6.1
Segnali di controllo del percorso dati
5.6.2
Gestione dei ritardi della memoria
185
186
187
155
156
5.7
Processori in stile CISC
5.7.1
Interconnessione che usa i bus
5.7.2
Controllo microprogrammato
Sommario
187
189
191
193
Introduzione al pipelining
195
6.1
Concetti fondamentali
195
6.2
Organizzazione in pipeline
196
6.3
Problematiche del pipelining
198
6.4
Dipendenze di dato
6.4.1
Inoltro di operandi
6.4.2
Gestione in software di dipendenze di dato
198
199
200
6.5
Ritardi della memoria
201
6.6
Ritardi
6.6.1
6.6.2
6.6.3
6.6.4
203
203
204
205
206
6.7
Limiti di risorse
nei salti
Salti incondizionati
Salti condizionati
Il posto del ritardo di salto
Predizione di salti
209
00PrPag_HAMACHER_2011 04/12/12 12:01 Pagina XI
Indice XI
7
8
6.8
Valutazione della prestazione
6.8.1
Effetti di stalli, penalità e cache miss
6.8.2
Numero di stadi della pipeline
210
211
212
6.9
Funzionamento superscalare
6.9.1
Salti e dipendenze di dato
6.9.2
Esecuzione fuori ordine
6.9.3
Completamento dell’esecuzione
6.9.4
Funzionamento dello smistamento
212
214
215
216
217
6.10
Pipeline nei processori CISC
6.10.1 Pipeline nei processori ColdFire
6.10.2 Pipeline nei processori Intel
Sommario
Note bibliografiche
218
219
219
220
220
Sistema di ingresso e uscita
221
7.1
Struttura a bus
221
7.2
Funzionamento del bus
7.2.1
Bus sincrono
7.2.2
Bus asincrono
7.2.3
Considerazioni elettriche
223
223
228
232
7.3
Arbitraggio
232
7.4
Interfacce di I/O
7.4.1
Interfaccia parallela
7.4.2
Interfaccia seriale
234
234
238
7.5
Standard di interconnessione
7.5.1
Bus seriale universale (USB)
7.5.2
FireWire
7.5.3
Bus PCI
7.5.4
Bus SCSI
7.5.5
SATA
7.5.6
SAS
7.5.7
PCI Express
Sommario
Note bibliografiche
242
242
246
247
251
252
253
253
254
254
Sistema di memoria
255
8.1
Concetti fondamentali
255
8.2
Memoria RAM a semiconduttori
8.2.1
Componente di memoria
8.2.2
Memoria statica
8.2.3
Memoria dinamica asincrona
8.2.4
Memoria dinamica sincrona
8.2.5
Banco di memoria
257
258
259
262
265
268
8.3
Memoria a sola lettura
8.3.1
Memoria ROM
8.3.2
Memoria PROM
271
271
272
00PrPag_HAMACHER_2011 04/12/12 12:01 Pagina XII
XII Indice
8.3.3
8.3.4
8.3.5
9
Memoria EPROM
Memoria EEPROM
Memoria flash
273
273
274
8.4
Tecnica di DMA
275
8.5
Gerarchia di memoria
278
8.6
Memoria cache
8.6.1
Schema di indirizzamento
8.6.2
Algoritmo di sostituzione
8.6.3
Esempio di indirizzamento
280
284
289
290
8.7
Considerazioni di prestazione
8.7.1
Guadagno di prestazione
8.7.2
Integrazione con il processore
8.7.3
Altre migliorie
294
295
296
297
8.8
Memoria virtuale
8.8.1
Traduzione di indirizzo
299
300
8.9 Gestione della memoria
306
8.10
Memoria di massa
8.10.1 Disco magnetico
8.10.2 Dischi ottici
8.10.3 Sistemi a nastri magnetici
Sommario
Note bibliografiche
306
307
313
317
318
319
Aritmetica
321
9.1
Addizionatore e sottrattore
9.1.1
Unità logica per addizione e sottrazione
321
323
9.2
Progettazione di addizionatori veloci
9.2.1
Addizione con anticipo del riporto
325
325
9.3
Moltiplicazione di numeri senza segno
9.3.1
Moltiplicatore a matrice
9.3.2
Circuito moltiplicatore sequenziale
329
330
331
9.4
Moltiplicazione di numeri con segno
9.4.1
Algoritmo di Booth
333
333
9.5
Moltiplicazione veloce
9.5.1
Ricodifica bit-pair dei moltiplicatori
9.5.2
Addizione di addendi con salvataggio del riporto
9.5.3
Albero di addizione degli addendi con riduttori 3-2
9.5.4
Albero di addizione degli addendi con riduttori 4-2
9.5.5
Sommario della moltiplicazione veloce
336
336
337
339
341
344
9.6
Divisione di interi
344
9.7
Numeri
9.7.1
9.7.2
9.7.3
347
351
352
354
9.8
Conversione da decimale a binario
e operazioni in virgola mobile
Operazioni Fondamentali
Bit di guardia e troncamento
Realizzazione di operazioni in virgola mobile
356
00PrPag_HAMACHER_2011 04/12/12 12:01 Pagina XIII
Indice XIII
Sommario
Note bibliografiche
10 Sistemi embedded
di sistemi embedded
Forno a microonde
Macchina fotografica digitale
Domotica
357
358
359
10.1
Esempi
10.1.1
10.1.2
10.1.3
10.2
Chip microcontrollori per applicazioni embedded
363
10.3
Un microcontrollore semplice
10.3.1 Interfacce parallele di I/O
10.3.2 Interfaccia di I/O seriale
10.3.3 Contatore/Temporizzatore
10.3.4 Meccanismo di controllo delle interruzioni
10.3.5 Esempi di programmazione
364
365
368
369
371
372
10.4
Cronometro di riflessi, un esempio completo
372
10.5
Sensori
10.5.1
10.5.2
10.5.3
375
375
379
380
10.6
Famiglie di microcontrollori
10.6.1 Microcontrollori basati su processore Intel 8051
10.6.2 Microcontrollori Freescale
10.6.3 Microcontrollori ARM
e attuatori
Sensori
Attuatori
Esempi di applicazione
10.7 Aspetti di progettazione
Sommario
Note bibliografiche
11 Elaborazione parallela e prestazioni
359
360
361
363
381
381
382
382
383
385
386
387
11.1
Multithreading hardware
387
11.2
Elaborazione vettoriale (SIMD)
11.2.1 Unità di elaborazione grafica (GPU)
388
391
11.3
Multiprocessori a memoria condivisa
11.3.1 Reti di interconnessione
391
393
11.4
Coerenza di cache
11.4.1 Protocollo di scrittura immediata
11.4.2 Protocollo di scrittura differita
11.4.3 Cache snoopy
11.4.4 Coerenza di cache basata su directory
396
396
396
397
398
11.5
Multicalcolatori a scambio di messaggi
399
11.6
Programmazione parallela per multiprocessori
399
11.7 Modellazione della prestazione
Sommario
Note bibliografiche
402
403
404
00PrPag_HAMACHER_2011 04/12/12 12:01 Pagina XIV
XIV
Indice
Caso di studio C1 Progetto di un sistema su un chip
405
Caso di studio C2 Architettura Intel IA-32
407
Appendice A Elementi di logica della commutazione
409
A.1
Funzioni logiche fondamentali
409
A.2
Sintesi di funzioni logiche
A.2.1
Sintesi intuitiva
A.2.2
Forma canonica
413
414
416
A.3
Sintesi in forma minima
A.3.1
Metodo di Karnaugh
A.3.2
Condizione di indifferenza
417
421
425
A.4
Sintesi con porte universali
426
A.5
Tecnologia microelettronica
A.5.1
Tecnologia CMOS
A.5.2
Ritardo di propagazione
A.5.3
Vincoli di fan-in e fan-out
A.5.4
Porta tri-state (o in alta impedenza)
A.5.5
Circuito integrato
430
432
438
439
440
441
A.6
Bistabili e flip-flop
A.6.1
Bistabile asincrono
A.6.2
Bistabile sincrono
A.6.3
Flip-flop master-slave
A.6.4
Flip-flop edge-triggered
A.6.5
Flip-flop di tipo T
A.6.6
Flip-flop di tipo JK
A.6.7
Flip-flop con preset e clear
443
443
445
448
449
451
451
453
A.7
Registro seriale-parallelo (ser.-par. register)
453
A.8
Contatore binario (binary counter)
456
A.9
Decodificatore (decoder)
457
A.10
Multiplatore (multiplexer)
458
A.11 Componenti programmabili (FPGA)
Sommario
Note bibliografiche
461
462
463
Indice analitico
I1
Eserciziario
E1