Sistemi E Reti

Il Data Register

Il registro DX (Data Register) e il suo ruolo fondamentale nella gestione dei dati a 32 bit e nelle operazioni di Divisione (DIV) in Assembly 8086, dove memorizza il resto.

Durata

PT20M

Software

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.


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.

  1. Aprire emu8086 e creare un nuovo programma .COM.
  2. Digitare il seguente codice:
  3. 
    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
        
  4. Compilare e iniziare l'esecuzione in modalità "Single Step".

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.

  1. 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).
  2. Osservazione Cruciale: L'operazione DIV ha 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.





Assembly, 8086, DX Register, DIV, Divisione, Dati 32 bit, emu8086, Matematica,