| In 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. |
| I 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
|
|
| L'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. |
| La 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)
|
|
| La 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. |
| In 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). |
| L'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). |
| Il 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...). |
| Purtroppo 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
|
|