- Competenza 1: Comprendere l'architettura interna di un sistema di elaborazione
- Competenza 2: Riconoscere le funzioni dei registri interni alla CPU
- Competenza 3: Saper operare con i dati a livello di bit e byte nei registri generali
- Competenza 4: Utilizzare strumenti di simulazione per l'analisi del ciclo di esecuzione delle istruzioni
Teoria: L'architettura interna e i Registri General Purpose
Il microprocessore Intel 8086, emulato dal software emu8086, dispone di una serie di celle di memoria interne estremamente veloci chiamate registri. A differenza della RAM, i registri risiedono direttamente nella CPU e sono fondamentali per l'elaborazione dei dati.
I registri a scopo generale (General Purpose) sono quattro e hanno una dimensione di 16 bit ciascuno. Essi possono essere utilizzati interi o divisi in due parti da 8 bit (High e Low) per gestire dati più piccoli.
| Registro (16 bit) | Parte Alta (8 bit) | Parte Bassa (8 bit) | Funzione Principale |
|---|---|---|---|
| AX (Accumulator) | AH | AL | Usato per operazioni aritmetiche, logiche e I/O. |
| BX (Base) | BH | BL | Usato spesso come puntatore base per l'indirizzamento. |
| CX (Count) | CH | CL | Utilizzato come contatore per i cicli (loop). |
| DX (Data) | DH | DL | Usato per dati extra in operazioni di divisione/moltiplicazione. |
Le istruzioni fondamentali: MOV e ADD
Per manipolare questi registri utilizziamo delle istruzioni. Le più comuni sono:
- MOV destinazione, sorgente: Copia il valore dalla sorgente alla destinazione.
- ADD destinazione, valore: Somma il valore al contenuto della destinazione.
LABORATORIO
Manipolazione dei Registri con emu8086
Imparerai a caricare valori nei registri e a osservare il cambiamento dei bit in tempo reale.
- PC con sistema operativo Windows
- Software emu8086 installato
1 Avvio e Configurazione del Progetto
Aprite emu8086. Dalla schermata iniziale (Dashboard), selezionate il pulsante New. Vi verrà chiesto di scegliere un modello: selezionate COM Template. Questo creerà un file con la direttiva ORG 100h, necessaria per i programmi semplici.
2 Caricamento Dati
Scrivete il seguente codice nell'editor per caricare valori nei registri ed eseguire una somma:
ORG 100h
MOV AX, 10h ; Carica 16 (10 hex) in AX
MOV BX, 20h ; Carica 32 (20 hex) in BX
ADD AX, BX ; AX = AX + BX (Risultato: 30h ovvero 48 dec)
RET
Procedura di test:
- Cliccate su Emulate.
- Nella finestra dell'emulatore, osservate la colonna dei registri.
- Cliccate su Single Step per eseguire una riga alla volta.
- Osservate come AX e BX cambiano colore e valore ad ogni clic.
3 Suddivisione dei Registri (Parte Alta e Parte Bassa)
Proviamo ora a dimostrare che AX è composto da AH e AL (Si può fare lo stesso ragionamento per gli altri registri). Inserite questo codice:
ORG 100h
MOV AH, 0FFh ; Carica il valore massimo in AH
MOV AL, 01h ; Carica 1 in AL
; Ora AX conterrà FF01h
RET
Capacità e Valori Massimi
Essendo dispositivi fisici, i registri hanno un limite di capienza basato sul numero di bit. È fondamentale conoscere questi limiti per evitare errori di calcolo:
| Tipo Registro | Dimensione | Valore Max (Decimale) | Valore Max (Esadecimale) |
|---|---|---|---|
| Registro Intero (es. AX) | 16 bit | 65.535 | FFFFh |
| Registro Suddiviso (es. AL) | 8 bit | 255 | FFh |
4 Analisi dell'Overflow: Superare il Limite
Cosa succede se aggiungiamo 1 a un registro che è già al suo valore massimo? In questo esercizio osserveremo il fenomeno del wraparound (il valore ricomincia da zero) e come la CPU segnala l'evento attraverso i Flags.
ORG 100h
MOV AX, 65535 ; Carica il valore massimo (FFFFh) in un registro a 16 bit
MOV BL, 255 ; Carica il valore massimo (FFh) in un registro a 8 bit
ADD AX, 1 ; AX diventa 0000h?
ADD BL, 1 ; BL diventa 00h?
RET
- Eseguite il codice passo dopo passo (Single Step).
- Osservate i Registri: Noterete che i registri non mostrano un errore, ma tornano semplicemente a 0. Questo perché la CPU non ha spazio fisico per il 17° bit (nel caso di AX) o per il 9° bit (nel caso di BL).
- Controllate i Flags: Aprite la finestra Flags dell'emulatore. Dopo l'istruzione
ADD, noterete che il flag C (Carry - Riporto) è diventato 1. - Riflessione tecnica: Il Carry Flag è il "segnale di allarme" che la CPU lancia al programmatore per dire: "Attenzione, il risultato è troppo grande per questo registro!".

Se esegui il codice che hai scritto, ecco l'analisi bit a bit:
Su AX (16 bit):
- AX è FFFFh (tutti i 16 bit a 1).
- Aggiungendo 1, il risultato matematico sarebbe 10000h (un 1 seguito da 16 zeri).
- Poiché AX può contenere solo 16 bit, il 17° bit (il riporto) "cade fuori" dal registro e finisce nel Carry Flag.
- Risultato in AX: 0000h.
Su BL (8 bit):
- BL è FFh (tutti gli 8 bit a 1).
- Aggiungendo 1, il risultato sarebbe 100h.
- BL può contenere solo 8 bit, quindi l'uno iniziale cade fuori.
- Risultato in BL: 00h.
4 Gestione Incasso
Scenario: Siete il tecnico di un sistema di cassa automatica. Dovete registrare l'incasso di due vendite.
- Utilizzate il registro CX per memorizzare il prezzo del primo prodotto: 50h.
- Utilizzate il registro DX per memorizzare il prezzo del secondo prodotto: 25h.
- Sommate i due valori e salvate il totale nel registro AX.
- Verifica: Quale valore esadecimale leggete in AX al termine dell'emulazione?