Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 034 di 198] 

    

    DAS - Aggiustamento Decimale dopo la Sottrazione
     
bulletQuando si esegue la sottrazione di 2 bytes, come è facilmente prevedibile, il risultato è certamente un numero esadecimale, nella logica del processore che lo ha generato; sebbene sembri poco naturale ciò vale anche se gli operandi sono numeri BCD impacchettati, cioè bytes del tipo xyH, con un codice BCD in ciascuno dei 4 bit di ciascun nibble, x e y.
bulletInfatti, se sembra banale sostenere che 33H - 21H da 12H nella logica umana è piuttosto difficile credere che 33H - 28H dia 0BH invece di 05H...
bulletL'istruzione DAS è stata pensata proprio per aggiustare in decimale il risultato esadecimale della sottrazione, cioè in sostanza per trasformare la logica del processore (per la quale il risultato è 0BH) in quella umana (per cui è invece 05H).
bulletA rigore possiamo dunque concludere che DAS trasforma in BCD impacchettato il byte esadecimale (inteso come somma) trovato in AL; dopo l'aggiustamento il nuovo dato a 8 bit viene lasciato ancora in AL, al posto di quello sorgente.
    
Ricorda... NB: Il risultato, lasciato in AL, è dunque a sua volta un numero BCD impacchettato e, come tale, non può che essere compreso tra 00H e 99H; il vantaggio è quello di offrire, almeno apparentemente, un risultato decimale, sebbene (come tradisce la presenza della H) si tratti assolutamente di un byte come gli altri...
     
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
       DAS
 AL   <<   AL - 6   se    AL AND  0FH >09H o se ff A =1
 AL   <<   AL - 60H   se    AL AND  F0H >90H o se ff C =1
 

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

DAS

 

4 3 4 2 no 1 ?       # # # # #
         
Suggerimento Ricordiamo che:
il nibble esprime un numero binario a 4 bit, di solito associato ad uno dei 16 elementi del sistema di numerazione esadecimale: per esempio 0000 > 0, 0001 > 1, ... , 1010 > A, .... , 1111 > F.
un codice BCD associa invece un numero binario a 4 bit ad uno dei 10 elementi del sistema di numerazione decimale; per questo le parole del codice sono dieci: 0000 > 0, 0001 > 1, ... , 1001 > 9.
     
bulletIl 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:
bulletla sottrazione non produce prestito (per esempio con AL=08-01=07H o AL=33-21=12H): l'istruzione non produce effetto:
bulletentrambi 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).
bulletnessuna 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

     
bulletla 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:
bulletad AL viene sottratto 6, nei nostri esempi 0E-06=08H o 0B-06=05.
bulletil nibble basso di AL è di nuovo un codice BCD, in stretto accordo con l'aggiustamento decimale esercitato sui nibble bassi degli operandi.
bulletla flag A (Auxiliary Carry) è posta a 1, come è ovvio
bulletil 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

     
bulletse 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:
bulletad AL viene sottratto 60H, nel nostro esempio E2+60=82.
bulletil nibble basso di AL non subisce variazioni
bulletil nibble alto di AL è di nuovo un codice BCD, in stretto accordo con l'aggiustamento decimale esercitato sui 2 nibble alti degli operandi.
bulletla 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

     
bulletIl comportamento dell'istruzione DAS può essere collaudato anche a partire da un byte esadecimale predisposto in AL, non necessariamente frutto di una precedente sottrazione di 2 bytes BCD:
bulletse il byte ha già aspetto di numero BCD compattato e la flag A (Auxiliary Carry) è trovata a 0, l'istruzione non produce effetto.
     

-R
AX=0009 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 2F     DAS
-T
AX=0009 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI PL NZ NA PE NC
118C:0101
------------------------------------------------------------
AX=0033 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 2F     DAS
-T
AX=0033 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI PL NZ NA PE NC
118C:0101
------------------------------------------------------------
AX=0098 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 2F     DAS
-T
AX=0098 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI NG NZ NA PO NC
118C:0101
------------------------------------------------------------
AX=0099 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 NG NZ NA PO NC
118C:0100 2F     DAS
-T
AX=0099 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI NG NZ NA PE NC
118C:0101

     
bulletse il byte ha già aspetto di numero BCD compattato ma la Auxiliary Carry) è trovata a 1, l'istruzione si attiva:
bulletad AL viene sottratto 6
bulletla flag A (Auxiliary Carry) è lascata a 1
bulletil nibble alto di AL viene decrementato.
     

-R
AX=0033 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 AC PO NC
118C:0100 2F     DAS
-T
AX=002D BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI PL NZ AC PE NC
118C:0101

     
bulletse il byte ha già aspetto di numero BCD compattato ma la flag C (Carry) è trovata a 1, l'istruzione si attiva:
bulletad AL viene sottratto 60H
bulletla flag C (Carry) è lascata a 1
bulletil nibble basso di AL è lasciato inalterato.
     

-R
AX=0033 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 CY
118C:0100 2F     DAS
-T
AX=00D3 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI NG NZ NA PO CY
118C:0101

     
bulletse il byte non ha l'aspetto di numero BCD compattato l'istruzione si comporta secondo la logica descritta precedentemente:
     

-R
AX=000B 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 2F     DAS
-T
AX=0005 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI PL NZ AC PE NC
118C:0101
------------------------------------------------------------
AX=008F 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 2F     DAS
-T
AX=0089 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI NG NZ AC PO NC
118C:0101
------------------------------------------------------------
AX=00A0 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 2F     DAS
-T
AX=0040 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 NV UP EI PL ZR NA PO CY
118C:0101
------------------------------------------------------------
AX=00CC 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 2F     DAS
-T
AX=0066 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0101 OV UP EI PL NZ AC PE CY
118C:0101

    

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 034 - DAS

    

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