| Il meccanismo che sta alla base di questa modifica è
piuttosto semplice; il comportamento dell'istruzione DAA
dipende dal valore del byte esadecimale,
lasciato in
AL
dalla precedente somma
di 2 bytes BCD; si possono prevedere 3 diversi
casi:
| la somma non
produce riporto (per esempio con AL=08+01=09H
o
AL=25+33=58H):
l'istruzione non
produce effetto:
| entrambi i nibble di AL
sono lasciati inalterati, dato che esprimono già un codice BCD tra
0000 (associato al decimale 0) e
1001 (associato al decimale
9). |
| nessuna delle flag viene
modificata |
|
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0100 NV UP EI PL NZ NA PO NC
118C:0100 B409 MOV AH,25
-T
AX=2500
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0102 NV UP EI PL NZ NA PO NC
118C:0102 B001 MOV AL,33
-T
AX=2533
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0104 NV UP EI PL NZ NA PO NC
118C:0104 00E0 ADD AL,AH
-T
AX=2558
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0106 NV UP EI PL NZ NA PO NC
118C:0106 27
DAA
-T
AX=2558
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0107 NV UP EI PL NZ NA PO NC
118C:0107
|
| la somma
produce sul nibble basso (cioè
sui 4 bit meno significativi) di AL un
valore
maggiore di 9, per esempio AL=08+04=0CH o
AL=09+33=3CH:
| ad AL viene sommato
6, nei nostri esempi 0C+06=12H
o 3C+06=42. |
| il nibble basso di AL
è di nuovo un codice BCD, in stretto accordo con
l'aggiustamento decimale esercitato sui nibble bassi degli operandi. |
| la flag A (Auxiliary Carry) è posta a 1, come è
ovvio |
| il nibble alto di AL
viene incrementato, in accordo con il rilevamento di un carry sul
valore del primo nibble (flag A=1). |
|
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0100 NV UP EI PL NZ NA PO NC
118C:0100 B409 MOV AH,09
-T
AX=0900
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0102 NV UP EI PL NZ NA PO NC
118C:0102 B001 MOV AL,33
-T
AX=0933
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0104 NV UP EI PL NZ NA PO NC
118C:0104 00E0 ADD AL,AH
-T
AX=
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0106 NV UP EI PL NZ NA PE NC
118C:0106 27
DAA
-T
AX=0942 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0107 NV UP EI PL NZ AC
PE NC
118C:0107
|
| la somma
produce sul nibble alto (cioè
sui 4 bit più significativi) di AL un
valore
maggiore di 9, per esempio AL=25+93=B8H:
| ad AL viene sommato
60H, nel nostro esempio B8+60=18. |
| il nibble basso di AL
non subisce variazioni |
| il nibble alto di AL
è di nuovo un codice BCD, in stretto accordo con
l'aggiustamento decimale esercitato sui 2 nibble alti degli operandi. |
| la flag C (Carry) è posta a
1; il valore corrente della flag di Carry si può dunque trattare
come la cifra BCD delle centinaia del
risultato (così, alla fine 25+93=118) |
|
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0100 NV UP EI PL NZ NA PO NC
118C:0100 B409 MOV AH,25
-T
AX=2500
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0102 NV UP EI PL NZ NA PO NC
118C:0102 B001 MOV AL,93
-T
AX=2593
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0104 NV UP EI PL NZ NA PO NC
118C:0104 00E0 ADD AL,AH
-T
AX=25B8
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0106 NV UP EI NG
NZ NA PE NC
118C:0106 27
DAA
-T
AX=2518
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0107 NV UP EI PL NZ NA PE
CY
118C:0107
|
|