Sistemi E Reti

I Registri A Scopo Generale

Studio dell'architettura interna della CPU x86: i registri a scopo generale (AX, BX, CX, DX) e la loro manipolazione tramite emu8086.

Durata

100 minuti

Software

emu8086

Assembly X86 | I Registri A Scopo Generale

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.


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.
Emu8086 registri a scopo generale

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
Emu8086 registri a scopo generale e capacità massima

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!".
Emu8086 registri a scopo generale e capacità massima
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?





Assembly, x86, Registri, Sistemi e Reti, emu8086,