DATI ED ISTRUZIONI

1. Introduzione

Le stringhe binarie che i calcolatori usano si possono dividere in due grandi classi, in base al loro senso logico: Le istruzioni dicono al calcolatore cosa deve fare. I dati sono le entità su cui tali istruzioni agiscono.

Si noti che istruzioni e dati, in una macchina di Von Neumann, convivono nello stesso luogo: la memoria centrale. Questa è una debolezza di questo tipo di calcolatori, poichè non c'è alcuna protezione fra i due tipi (stringhe di dati possono essere scambiate per istruzioni e viceversa). Sta ai programmatori scrivere programmi sufficientemente corretti da non creare problemi in questo senso.

2. Istruzioni

Un programma scritto in linguaggio macchina (cioè direttamente comprensibile dal calcolatore) è un insieme di tali istruzioni binarie. Un programmatore è la persona che scrive tali stringhe. In realtà i programmatori scrivono programmi in linguaggi che usano codici mnemonici al posto di sequenze binarie. Queste sequenze vengono poi tradotte da appositi programmi in stringhe binarie.

Esistono 4 classi di istruzioni: Per quanto riguarda la "codifica" delle istruzioni, ovvero il modo di esprimere con stringhe binarie le azioni che si vuole che il calcolatore esegua, si usa dividere idealmente ogni istruzione in due campi logici: (esempio a 32 bit)
16 bit: codice istruzione 16 bit: referenziamento operandi
Il primo campo contiene il codice dell'istruzione: ogni istruzione è identificata univocamente tramite un numero binario di massimo 16 bit (verrà interpretato dal decodificatore di istruzione).
Il secondo campo contiene il referenziamento degli operandi: ogni istruzione agisce su un certo numero di dati (eventualmente zero); la loro posizione nel calcolatore viene indicata in questa parte dell'istruzione (verranno recuperati dal pc tramite preselezione inviata dal codificatore dei comandi).

Il referenziamento degli operandi può essere di due tipi: esplicito ed implicito.
Nel caso di referenziamento esplicito, nel campo "referenziamento degli operandi" viene effettivamente indicato dove si trovano gli operandi (memoria centrale o registri di memorizzazione interni alla CPU).
Nel caso di referenziamento implicito, il campo "referenziamento degli operandi" non esiste. In questo caso, infatti, ci si aspetta di trovare gli operandi in posizioni fisse (registri della CU detti accumulatori), prestabilite dal progettista della macchina.

Parlando del referenziamento esplicito, sorge un altro problema: se si decide di usare operandi che si trovano nella memoria centrale, lo spazio di 16 bit non basta neanche per indirizzarne uno (servono 32 bit per ogni indirizzo).
Esistono due soluzioni.
La prima consiste nell'utilizzare istruzioni più lunghe di una parola (istruzioni a lunghezza variabile poichè si possono avere istruzioni di 1, 2, 3, ecc. parole - ogni parola serve per l'indirizzo di un operatore).
La seconda consiste nell'usare i registri di memorizzazione interni della CU. Questi, essendo in numero esiguo, sono indirizzabili tramite stringhe molto corte, che riescono quindi a stare nei 16 bit disponibili (istruzioni a lunghezza fissa).

Sempre riguardo l'indirizzamento esplicito, esistono le seguenti possibilità di referenziamento: Utilizzando l'indirizzamento implicito, le istruzioni sono poco potenti: ne servono molte per fare anche le operazioni più semplici. Si consideri ad esempio una istruzione che somma due interi. Bisogna prima portare i due operandi dalla memoria o dai registri in cui sono ai registri predefiniti; bisogna quindi chiamare l'istruzione ed infine spostare il risultato dal registro in cui viene di default messo, alla memoria o al registro in cui si intende conservarlo.
Le istruzioni che utilizzano l'indirizzamento esplicito, invece, sono più potenti proprio perchè più complesse. Utilizzando ancora l'esempio della somma di due interi, basta una sola istruzione, nella quale vengono contestualmente indicate le posizioni degli operandi e del risultato.

Perchè un'istruzione sia eseguita da una macchina di Von Neumann sono necessarie le seguenti fasi: Nel caricamento, il PC e la memoria centrale si mettono in comunicazione su richiesta del PC; l'indirizzo che PC conta raggiunge l'ingresso "Indirizzi" della memoria, la quale manda in output la stringa trovata; memoria centrale e decodificatore di istruzione si connettono su richiesta del PC; la stringa trovata in memoria raggiunge il decodificatore di istruzione.
Nella decodifica (riconoscimento), agisce il decodificatore di istruzione, che decodifica il campo "codice istruzione".
Nella esecuzione, agisce il codificatore dei comandi che manda istruzioni a tutte le unità che servono (ad esempio fa saltare il PC alla locazione di memoira dove si trova un certo operando).