- Comprendere il ruolo specializzato del registro DX come estensione per l\'accumulatore (AX).
- Comprendere il concetto di operazione a 32 bit (dividendo) utilizzando la coppia di registri DX:AX.
- Saper utilizzare l\'istruzione DIV per eseguire la divisione intera.
- Saper interpretare i risultati di una divisione, identificando il Quoziente in AX e il Resto in DX.
- Acquisire la capacità di osservare e tracciare le modifiche ai registri DX e AX in emu8086.
1 Il Data Register (DX): Estensione dell'Accumulatore
Il registro DX (Data Register) è un registro a 16 bit (composto da DH e DL), parte dei registri a scopo generale, ma con una funzione cruciale e specializzata in aritmetica.
La sua funzione principale è agire come estensione del registro Accumulatore (AX) per eseguire operazioni che coinvolgono un numero di dati maggiore di 16 bit. Quando i dati superano la capacità di AX (65535), la CPU li gestisce come se DX e AX fossero un unico grande registro a 32 bit, indicato come DX:AX.
2 DX e la Divisione (Istruzione DIV)
La divisione intera è l'esempio più chiaro e immediato dell'uso di DX. L'istruzione DIV (Divide) nell'8086 opera nel seguente modo per una divisione a 16 bit per 8 bit:
- Dividendo (Valore da Dividere): Deve essere caricato nel registro Accumulatore AX (16 bit).
- Divisore: Deve essere fornito come operando all'istruzione DIV (ad esempio, un registro a 8 bit come BL o una variabile).
-
Risultati: L'istruzione DIV calcola automaticamente il risultato:
- Il Quoziente (risultato intero) viene memorizzato in AL.
- Il Resto (ciò che avanza) viene memorizzato in AH.
Per una divisione a 32 bit per 16 bit (più comune con DX), la situazione è ancora più interessante e coinvolge DX in modo diretto:
- Dividendo (32 bit): Il numero da dividere viene caricato nella coppia di registri DX:AX (DX contiene i 16 bit più significativi, AX i 16 bit meno significativi).
- Divisore: Un registro a 16 bit (es. BX).
-
Risultati:
- Il Quoziente (risultato intero) viene memorizzato in AX.
- Il Resto viene memorizzato in DX.
3 Preparazione per la Divisione (Importante!)
Quando si esegue una divisione a 16 bit per 16 bit, anche se il dividendo in AX non è superiore a 16 bit, è una buona prassi (e spesso necessario) azzerare il registro DX prima di eseguire la DIV per garantire che il dividendo a 32 bit (DX:AX) sia corretto.
MOV DX, 0 ; Azzerare l'estensione alta!
LABORATORIO
Divisione e Isolamento del Resto
Eseguiremo una divisione intera per vedere in modo chiaro come il registro DX riceve il resto dell'operazione, una funzione essenziale per molti algoritmi.
- emu8086 (IDE e Emulatore)
1 Setup: Divisione 100 Diviso 7
Vogliamo calcolare 100 div 7. Il risultato atteso è 14 con resto 2. Dobbiamo preparare AX come dividendo, DX come estensione zero e BX come divisore.
- Aprire emu8086 e creare un nuovo programma .COM.
- Digitare il seguente codice:
- Compilare e iniziare l'esecuzione in modalità "Single Step".
ORG 100h
; 1. Preparazione del Dividendo (DX:AX)
MOV AX, 100 ; Dividendo (100 in Decimale) in AX
MOV DX, 0 ; Azzeriamo DX per garantire che l'input sia 0000:0064h (100)
; 2. Preparazione del Divisore
MOV BX, 7 ; Divisore (7 in Decimale) in BX
; 3. Esecuzione della Divisione (DX:AX / BX)
DIV BX ; Esegue la divisione
RET
2 Tracciamento e Interpretazione dei Risultati
Eseguire il codice passo dopo passo e verificare il contenuto di DX e AX dopo l'istruzione DIV BX.
- Dopo l'esecuzione di
DIV BX, controllare i registri:- AX (Quoziente): Dovrebbe contenere 000Eh (14 in Decimale).
- DX (Resto): Dovrebbe contenere 0002h (2 in Decimale).
-
Osservazione Cruciale: L'operazione
DIVha automaticamente sovrascritto sia AX che DX con i due componenti del risultato, dimostrando il ruolo di DX come contenitore del resto.
3 Esercizio Autonomo: Estrarre l'Ultima Cifra
Uno degli usi più comuni del resto è isolare le singole cifre di un numero (modulo 10). Scrivere un programma che isoli la cifra delle unità del numero 123.
- Logica: La cifra delle unità di qualsiasi numero si ottiene dividendo quel numero per 10 e prendendo il resto.
- Input: Dividendo 123 in AX, Divisore 10 in BX (o un altro registro/memoria).
- Obiettivo: Dopo l'istruzione
DIV, il registro DX dovrà contenere il valore 3.