| Poiché 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. |
| I 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
|
|
| L'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)
|
|
| La 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. |
| In 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). |
| L'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). |
| Il 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). |
| Purtroppo 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)
|
|
| Per 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). |
| Inoltre 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. |
| Naturalmente 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)
|
|