ALU (Arithmetic Logic Unit)
ARITHMETIC-LOGIC UNIT (ALU) Classico simbolo di un’ ALU: A e B sono gli operandi in ingresso. R è il risultato. OpCode è il codice operazione proveniente dall'unità di controllo. Flags sono i segnali di stato dell'unità.
ARITHMETIC-LOGIC UNIT (ALU) In informatica l'unità aritmetica-logica identifica la parte del microprocessore che è deputata ai calcoli matematici ed alle operazioni logiche, è una componente fondamentale della CPU, attualmente l'ALU è tipicamente implementata come parte del microprocessore. Le moderne CPU sono dotate di ALU molto sofisticate e un singolo microprocessore può contenere anche più ALU. In alcuni processori è suddivisa in due parti: la parte logica (LU) e la parte aritmetica (AU), inoltre è possibile che nello stesso processore vi siano più AU (una per le operazioni a virgola fissa e una per le operazioni a virgola mobile). In genere gli ingegneri tendono a definire ALU le unità in grado di eseguire operazioni sui numeri interi mentre le unità che eseguono operazioni su numeri in virgola mobile, numeri complessi, etc ricevono nomi meno generici.
Le operazioni dell’unità Operazioni aritmetiche: addizione, sottrazione, moltiplicazione, divisione. Per ridurre il numero dei circuiti la sottrazione viene effettuata dall'ALU, come complemento, uno dei due numeri (addizione). Operazioni logiche: si basano sulle regole dell'algebra di Boole e sugli operatori logici AND, OR, XOR, NAND, NOR. Operazioni di confronto: si basano sul controllo della differenza aritmetica tra due numeri (dati). L'ALU utilizza gli stessi circuiti delle operazioni aritmetiche (complemento uno della sottrazione) per calcolare la relazione di uguaglianza o meno tra due numeri. Le principali operazioni di confronto sono: maggiore, minore, uguale, diverso, maggiore-uguale, minore-uguale.
Vediamo come funziona L'unità di controllo (CU) richiede all'unità ALU di effettuare una particolare operazione logico-matematica sui dati. I dati (input) sono prelevati dai registri del processore. L'operazione e i dati sono elaborati in linguaggio binario. Una volta elaborata l'operazione, il risultato finale in output viene registrato nella locazione di memoria dell'unità aritmetico-logica, detta accumulatore, o nei registri di uscita del processore e restituito all'unità di controllo.
Vediamo un esempio Questo è un esempio molto semplice, per capire come può essere progettata una ALU, con i suoi circuiti interni. Infatti nella figura qui sopra è rappresentata un ALU con due operandi in input A e B, come output un risultato C che può essere, un OR o un AND tra i dati d’ingresso. L’operazione, ovvero l’OpCode da fare sui dati, viene selezionata dalla CU, che a sua volta l’ha letta e codificata dal programma prelevato in memoria.
OpCode (Codice Operazione) Esempio di un ALU a 4-bit OpCode (Codice Operazione) S2 S1 S0 ALU Funzione Descrizione F = A + B Add 1 F = A - B Subtract F = A + 1 Increment F = A - 1 Decrement F = A Λ B AND F = A V B OR F = Ā NOT F = A B XOR A e B dati input a 4 bit F è il risultato a 4 bit S2 , S1 e S0 sono la combinazione di 3 bit che la CU da all’ALU come OpCode C, P, Z, S e O sono i flags (bandierine), sono degli indicatori che la CPU alza o abbassa a seconda del verificarsi di certe condizioni, ovvero sono influenzati dai risultati delle operazioni di calcolo aritmetico svolte dalla ALU. I flags fisicamente sono i bit del registro di stato.
Process Status Word (PSW) o registro di stato - I Flags Nel registro di stato, del INTEL 8086, solo 9 dei 16 bit sono significativi e si dividono in: Flag di stato (bit 0, 2, 4, 6, 7, 11): sono influenzati dai risultati delle operazioni di calcolo aritmetico svolte dalla ALU; anche se esistono istruzioni che ne forzano il cambiamento di valore, vengono soprattutto consultati dalle istruzioni di salto condizionato; Flag di controllo (bit 8, 9, 10): permettono di impostare alcune modalità operative della CPU grazie ad apposite istruzioni che impostano il loro valore.
I Flags di stato Flag di carry (Cf) bit (0): in caso di operazioni su numeri senza segno, vale 1 se la somma precedente ha fornito un riporto (carry) o se la differenza precedente ha fornito un prestito (borrow); Flag di parità (Pf) bit (2): vale 1 se l'operazione precedente ha dato un risultato che ha un numero pari di bit con valore uno; Flag di carry ausiliario (Af) bit (4): opera come il flag Cf però relativamente a prestiti e riporti tra il bit 3 e il bit 4 dei valori coinvolti, cioè opera a livello di semibyte (o nibble); è un flag utile soprattutto quando si opera con valori espressi nel codice BCD (Binary Coded Decimal);
I Flags di stato Flag di zero (Zf) bit (6): vale 1 se l'ultima operazione ha dato risultato zero; Flag di segno (Sf) bit (7): vale 1 se il segno del risultato dell'ultima operazione è negativo; essendo i valori espressi in complemento a due, tale flag viene valorizzato semplicemente tramite la copia del bit più significativo del risultato, che vale appunto 1 per i numeri negativi; Flag di overflow (Of) bit (11): ha la stessa funzione del flag cf ma per numeri con segno; in pratica segnala se l'ultima operazione ha fornito un risultato che esce dall'intervallo dei valori interi rappresentabili nell'aritmetica del processore;
I Flags di controllo Flag di trap (Tf) bit (8): viene impostato a 1 per avere l'esecuzione del programma step by step; utile quando si fa il debug dei programmi; Flag di interrupt (If) bit (9): viene impostato a 1 (istruzione sti) per abilitare le risposte ai segnali di interruzione provenienti dalle periferiche; viene impostato a 0 (istruzione cli) mascherare le interruzioni; Flag di direzione (Df) bit (10): si imposta per stabilire la direzione secondo la quale operano le istruzioni che gestiscono i caratteri di una stringa (1 verso sinistra, o in ordine decrescente di memoria, 0 verso destra, o in ordine crescente di memoria).