Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 002 di 198] 

    

    AAD - Aggiustamento Ascii prima della Divisione
     
bulletQuesta istruzione trasforma un numero BCD non impacchettato (cioè formato da 2 bytes, ciascuno con i 4 bit più significativi a 0 e con un codice BCD nei rimanenti), fornito in AX, nel byte esadecimale corrispondente, lasciato in AL; in ogni caso lascia AH a 00H.
    
Ricorda... NB: il risultato è significativo solo se entrambi i bytes da trasformare, predisposti in AH (decine) e in AL (unità) hanno valore rigorosamente compreso tra 00H e 09H.
     
bulletLa definizione non è molto calzante in quanto, come anticipato, l'aggiustamento imposto non è Ascii, ma decimale.
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
     AAD
 AH   <<   0      
 AL   <<   AH * 10 + AL     
 

Esempio di Applicazione

Cicli di Clock Mem
Acces

Bytes
Flag   influenzate
Mnemonico Operandi 86 268 386 486 O D I T S Z A P C

AAD

 

60 14 19 14 no 2 ?       # # ? # ?
         
Suggerimento Ricordiamo che il codice BCD è composto da dieci parole che associano un numero binario a 4 bit ad ognuno dei 10 elementi del sistema di numerazione decimale: 0000 > 0, 0001 > 1, ... , 1001 > 9.
     
bulletIn sostanza AAD calcola il valore esadecimale xyH che corrisponde alla somma del contenuto (BCD) di AL con il contenuto (BCD) di AH moltiplicato per 10 e poi azzera AH; dopo il suo intervento il contenuto di AX è del tipo 00xyH.
bulletI numerosi esempi seguenti dovrebbero levare ogni dubbio: per tutti l'ultimo, per il quale il BCD non impaccato 99 (fornito in ingresso in AX=0909H) diventa l'esadecimale 63H (appunto 99 in decimale) lasciato ancora in AX=0063H:
     

AX=0008 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0103 NV UP EI PL NZ NA PO NC
1192:0103 D50A   AAD
-T
AX=0008 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0105 NV UP EI PL NZ NA PO NC
1192:0105 

     

AX=0100 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0103 NV UP EI PL NZ NA PO NC
1192:0103 D50A   AAD
-T
AX=000A BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0105 NV UP EI PL NZ NA PE NC
1192:0105

     

AX=0108 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0103 NV UP EI PL NZ NA PE NC
1192:0103 D50A   AAD
-T
AX=0012 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0105 NV UP EI PL NZ AC PE NC
1192:0105

     

AX=0604 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0103 NV UP EI PL NZ AC PE NC
1192:0103 D50A   AAD
-T
AX=0040 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0105 NV UP EI PL NZ AC PO NC
1192:0105

     

AX=0909 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0103 NV UP EI PL NZ AC PO NC
1192:0103 D50A   AAD
-T
AX=0063 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0105 NV UP EI PL NZ AC PE NC
1192:0105

     
bulletL'istruzione AAD prende il nome dal fatto che rende possibile la divisione di un numero BCD non impacchettato: eseguita prima di una DIV (o IDIV), sostituendo l'informazione originale presente in AX con il valore esadecimale corrispondente, rende significativa questa operazione.
bulletLa divisione opera infatti solo su numeri esadecimali e lascia in AL il quoziente e in AH il resto.
     

-R AX 0908
-R BX 0009
-R
AX=0908 BX=0009 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0100 NV UP EI PL NZ AC PO NC
1192:0100 D50A   AAD  ;da AH=09H, AL=08H  a   AX=0062H
-T
AX=0062 BX=0009 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0102 NV UP EI PL NZ AC PO NC
1192:0102 F6F3   DIV BL 
-T
AX=080A BX=0009 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0104 NV UP EI PL NZ AC PO NC
1192:0104   >>> AX/BL = 0062H/09H = 0AH(AL) con resto 08H(AH)

     
bulletLa AAD si presta anche ad una curiosa interpretazione ufficialmente non documentata: l'osservazione critica del suo codice macchina fa ritenere che sia un'istruzione a 2 codici operativi, D5H e 0AH; in realtà solo il primo è un codice operativo mentre il secondo (seppur non ufficialmente) può ritenersi un operando.
bulletIn effetti il secondo bytes, 0AH, cioè il numero 10 decimale, richiama alla memoria il fattore con cui, nell'uso normale, è stato moltiplicato il contenuto di AH (al cui risultato è stato poi aggiunto AL).
bulletL'uso non ufficiale di AAD si può provare con qualunque bytes, al posto di 0AH, dopo il codice operativo D5H; per esempio, continuando con il gioco (ricordiamo che il risultato non è garantito...), se fosse possibile codificare AAD con i bytes D5H, 10H il moltiplicatore di AH sarebbe 16 (e non 10).
bulletIl risultato finale (dopo l'aggiunta di AL) è piuttosto simpatico e certamente utile: un numero esadecimale che esprime, con le sue cifre, il numero decimale compattato corrispondente ai 2 BCD non compattati passati in AH, AL; per esempio, partendo da AH=02H, AL=07H dopo la AAD normale si ha AX=001BH (appunto 27 in esadecimale), mentre dopo la AAD modificata si ha AX=0027H (cioè con i 2 BCD compattati, anche se per la cronaca il valore è pari a 39 decimale...).
bulletPurtroppo la dichiarazione AAD 10H viene segnalata (ovviamente) con errore di sintassi, ma, naturalmente nulla è impossibile: con il comando E di debug si possono introdurre fisicamente i 2 bytes nella memoria di programma, e il successivo collaudo è piuttosto gratificante:
     

-R AX 0909
-E 100
1192:0100 D5. 0A.10
-r
AX=0909 BX=00090 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0100 NV UP EI PL NZ AC PO NC
1192:0100 D510 AAD 10
-p
AX=0099 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0102 NV UP EI NG NZ NA PE NC
1192:0102 

     

-R AX 0505
-E 100
1192:0100 D5. 0A.10
-r
AX=0505 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0100 NV UP EI PL NZ AC PO NC
1192:0100 D510 AAD 10
-p
AX=0055 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0102 NV UP EI NG NZ NA PE NC
1192:0102 

     

-R AX 0207
-E 100
1192:0100 D5. 0A.10
-r
AX=0207 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=010E NV UP EI PL NZ NA PE NC
1192:0100 D510 AAD 10
-t
AX=0027 BX=0000 CX=0000 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0102 NV UP EI NG NZ NA PE NC
1192:0102 

    
Ricorda... NB: l'istruzione AAM esegue il servizio esattamente opposto, trasformando un esadecimale di tipo 00xyH nella coppia BCD non impacchettata 0xH , 0yH.

    

Pagina Precedente Scheda n° 07 Pagina Successiva Istruzioni Cpu 80x86 Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Istruzione 002 - AAD

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati