| Il meccanismo che sta alla base di questa modifica è
piuttosto semplice; il comportamento dell'istruzione DAS
dipende dal valore del byte esadecimale,
lasciato in
AL
dalla precedente sottrazione
di 2 bytes BCD; si possono prevedere 3 diversi
casi:
| la sottrazione non
produce prestito (per esempio con AL=08-01=07H
o
AL=33-21=12H):
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,21
-T
AX=2100
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=2133
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 SUB AL,AH
-T
AX=2112
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 2F
DAS
-T
AX=2112
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 NC
118C:0107
|
| la sottrazione produce sul nibble basso (cioè
sui 4 bit meno significativi) di AL un
valore maggiore di 9, per esempio AL=12-04=0EH o
AL=33-28=0BH:
| ad AL viene
sottratto 6, nei nostri esempi 0E-06=08H
o 0B-06=05. |
| 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 decrementato, 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,28
-T
AX=2800
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=2833
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 SUB AL,AH
-T
AX=282B
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 AC
PO NC
118C:0106 2F
DAS
-T
AX=2805 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
|
| se la sottrazione eseguita in precedenza
opera su dati BCD non è possibile ora produrre sul nibble alto (cioè
sui 4 bit più significativi) di AL un
valore maggiore di 9, se non in
presenza di operandi non corretti, come nell'esempio: AL=75-93=E2H:
| ad AL viene
sottratto 60H, nel nostro esempio E2+60=82. |
| 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
primo operando (prestito)
(così, alla fine 175+93=82) |
|
-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,93
-T
AX=9300
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,75
-T
AX=9375
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 SUB AL,AH
-T
AX=93E2
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 CY
118C:0106 2F
DAS
-T
AX=9382
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
|
|