Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 033 di 198] 

    

    DAA - Aggiustamento Decimale dopo l'Addizione
     
bulletQuando si esegue la somma 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 21H + 33H da 54H nella logica umana è piuttosto difficile credere che 33H + 28H dia 5BH invece di 61H...
bulletL'istruzione DAA è stata pensata proprio per aggiustare in decimale il risultato esadecimale della somma , cioè in sostanza per trasformare la logica del processore (per la quale il risultato è 5BH) in quella umana (per cui è invece 61H).
bulletA rigore possiamo dunque concludere che DAA 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):
         
        DAA
 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

DAA

 

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 DAA dipende dal valore del byte esadecimale, lasciato in AL dalla precedente somma di 2 bytes BCD; si possono prevedere 3 diversi casi:
bulletla somma non produce riporto (per esempio con AL=08+01=09H o AL=25+33=58H): 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,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

     
bulletla 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:
bulletad AL viene sommato 6, nei nostri esempi 0C+06=12H o 3C+06=42.
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 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

     
bulletla somma produce sul nibble alto (cioè sui 4 bit più significativi) di AL un valore maggiore di 9, per esempio AL=25+93=B8H:
bulletad AL viene sommato 60H, nel nostro esempio B8+60=18.
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 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

     
bulletIl comportamento dell'istruzione DAA può essere collaudato anche a partire da un byte esadecimale predisposto in AL, non necessariamente frutto di una precedente somma 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 27     DAA
-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 27     DAA
-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 27     DAA
-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 27     DAA
-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 flag A (Auxiliary Carry) è trovata a 1, l'istruzione si attiva:
bulletad AL viene sommato 6
bulletla flag A (Auxiliary Carry) è lascata a 1
bulletil nibble alto di AL viene 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 AC PO NC
118C:0100 27     DAA
-T
AX=0039 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 sommato 60H
bulletla flag C (Carry) è lascata a 1
     

-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 27     DAA
-T
AX=0093 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 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 27     DAA
-T
AX=0011 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 27     DAA
-T
AX=0095 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 PE 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 27     DAA
-T
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=0101 NV UP EI PL ZR NA PE 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 27     DAA
-T
AX=0032 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 PO 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 033 - DAA

    

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