Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 003 di 198] 

    

    AAM - Aggiustamento Ascii dopo la Moltiplicazione
     
bulletQuesta istruzione trasforma un numero esadecimale di tipo xyH fornito in AL, nel numero BCD non impacchettato, cioè formato da 2 bytes lasciati rispettivamente in AH (decine) e AL (unità), ciascuno con i 4 bit più significativi a 0 e con un codice BCD nei rimanenti, cioè con valore compreso tra 00H e 09H.
    
Ricorda... NB: il risultato è significativo solo se il numero esadecimale da trasformare, predisposto in AL, ha valore rigorosamente minore o uguale a (99)decimale, cioè 63H.
     
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):
         
     AAM
 AH   <<   AL / 10    
 AL   <<   AL MOD 10     
 

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

AAM

 

83 16 17 15 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.
     
bulletPoiché il numero esadecimale di partenza deve essere di tipo xyH (con xyH<=63H) la AAM calcola i 2 valori BCD non impacchettati dividendo AL per 10; il quoziente (AL/10) è lasciato in AH e il resto (AL mod 10) in AL.
bulletI numerosi esempi seguenti dovrebbero levare ogni dubbio: per tutti l'ultimo, per il quale l'esadecimale 63H, preso da AL=63H, diventa il decimale 99 (lasciato in uscita in AX=0909H, in BCD non impaccato): 
     

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 D40A   AAM
-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=000A 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 D40A   AAM
-T
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=0105 NV UP EI PL NZ NA PE NC
1192:0105

     

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=0103 NV UP EI PL NZ NA PE NC
1192:0103 D40A   AAM
-T
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=0105 NV UP EI PL NZ AC PE NC
1192:0105

     

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=0103 NV UP EI PL NZ AC PE NC
1192:0103 D40A   AAM
-T
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=0105 NV UP EI PL NZ AC PO NC
1192:0105

     

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=0103 NV UP EI PL NZ AC PO NC
1192:0103 D40A   AAM
-T
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=0105 NV UP EI PL NZ AC PE NC
1192:0105

     
bulletL'istruzione AAM prende il nome dal fatto che, usata dopo la moltiplicazione MUL di 2 numeri BCD non impacchettati, permette di riproporre il risultato dell'operazione ancora in BCD non impacchettato, in AH (decine) e in AL (unità), a partire da quello esadecimale lasciato in AX da MUL.
     

-R AX 0008
-R BX 0009
-R
AX=0008 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 NA PO NC
1192:0100 F6E3    MUL BL ;da AL*BL=08H*09H a AX=0048H=72decim
-T
AX=0048 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 NA PO NC
1192:0102 D40A    AAM  
-T
AX=0702 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 NA PO NC
1192:0104    >>> AL/10 = 0048H/0AH = 07H(AH) con resto 02H(AL)

     
bulletLa AAM 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, D4H 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 creato il quoziente (AL/10) e il resto (AL mod 10).
bulletL'uso non ufficiale di AAM si può provare con qualunque bytes, al posto di 0AH, dopo il codice operativo D4H; per esempio, continuando con il gioco (ricordiamo che il risultato non è garantito...), se fosse possibile codificare AAM con i bytes D5H, 10H il divisore di AL sarebbe 16 (e non 10).
bulletIl risultato è piuttosto simpatico e forse di qualche utilità: un numero BCD non campattato, lasciato in AH (decine) e AL (unità) che esprime, con i suoi 2 bytes, il numero esadecimale passato in AL; per esempio, partendo da AL=12H (18 in decimale) dopo la AAM normale si ha AH=01H e AL=08H, mentre dopo la AAM modificata si ha AH=01H e AL=02H (cioè i 2 BCD non compattati di 12H).
bulletPurtroppo la dichiarazione AAM 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 0012
-E 100
1192:0100 D4. 0A.10
-R
AX=0012 BX=0000 CX=0001 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 NA PO NC
1192:0100 D410 AAM 10
-T
AX=0102 BX=0000 CX=0001 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 NA PE NC
1192:0102 >> AL/16=12H/10H=18/16=01H(1,AH) con resto 02H(2,AL)

     

-R AX 0040
-E 100
1192:0100 D4. 0A.10
-R
AX=0040 BX=0000 CX=0001 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 NA PO NC
1192:0100 D410 AAM 10
-T
AX=0400 BX=0000 CX=0001 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 NA PO NC
1192:0102 >> AL/16 =40H/10H =64/16=04H(4,AH) con resto 00H(0,AL)

     

-R AX 0063
-E 100
1192:0100 D4. 0A.10
-R
AX=0063 BX=0000 CX=0001 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 NA PO NC
1192:0100 D410 AAM 10
-T
AX=0603 BX=0000 CX=0001 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0102 NV UP EI PL ZR NA PE NC
1192:0102 >> AL/16 =12H/10H =99/16=06H(6,AH) con resto 03H(3,AL)

     
bulletPer amore della ricerca possiamo verificare che l'uso non documentato di AAM xxH è molto simile a DIV xxH, per cui sembra sostanzialmente inutile e ridicolo insistere nel suo utilizzo improprio; entrambe operano su AX, ma AAM ignora la parte alta AH (cioè tratta solo AL, e quindi è significativa solo se AX è del tipo 00xxH).
bulletInoltre le 2 istruzioni si scambiano i registri del risultato: AAM lascia il quoziente in AH e il resto in AL, mentre DIV fa esattamente l'opposto.
bulletNaturalmente venendo meno i presupposti il byte esadecimale da trattare non è più soggetto al limite decimale di 100 (63H); vediamo cosa succede con diversi operandi xxH e con diversi valori di AL:
     

-R AX 0099
-E 100
1192:0100 D4. 0A.07
-R
AX=0099 BX=0000 CX=0001 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 NA PO NC
1192:0100 D407 AAM 07
-T
AX=1506 BX=0000 CX=0001 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 NA PE NC
1192:0102 >> AL/7 =0099H/07H =153/7=15H(21,AH) con resto 06H(6,AL)

     

-R AX 00AA
-E 100
1192:0100 D4. 0A.07
-R
AX=00AA BX=0000 CX=0001 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 NA PO NC
1192:0100 D407 AAM 07
-T
AX=1802 BX=0000 CX=0001 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 NA PO NC
1192:0102 >> AL/7 =00AAH/07H =170/7=18H(24,AH) con resto 02H(2,AL)

     

-R AX 0055
-E 100
1192:0100 D4. 0A.05
-R
AX=0055 BX=0000 CX=0001 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 NA PO NC
1192:0100 D407 AAM 05
-T
AX=1100 BX=0000 CX=0001 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0102 NV UP EI PL ZR NA PE NC
1192:0102 >> AL/5 =0055H/05H= 85/5=11H(17,AH) con resto 00H(0,AL)

     

-R AX 0088
-E 100
1192:0100 D4. 0A.05
-R
AX=0088 BX=0000 CX=0001 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0100 NV UP EI PL ZR NA PE NC
1192:0100 D407 AAM 05
-T
AX=1B01 BX=0000 CX=0001 DX=0000 SP=ED5D BP=0000 SI=0000 DI=0000
DS=1192 ES=1192 SS=1192 CS=1192 IP=0100 NV UP EI PL ZR NA PE NC
1192:0102 >> AL/5 =0088H/05H =136/5=1BH(27,AH) con resto 01H(1,AL)

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

    

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 003 - AAM

    

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