Newsgroup: it.comp.lang.c
Titolo: registro flag AF

Tale registro flag AF Carry ausiliario: Segnala che occorre l'aggiustamento
in un'operazione aritmetica in BCD.
Domanda.!
Cos'è un aggiustamento in un'operazione aritmetica?
Gentili frequentatori prima che mi si azzecca il cervello, qualcuno di voi
animato di buona volontà può darmi una spiegazione? Grazie..!

Cos'h un aggiustamento in un'operazione aritmetica?
Il formato BCD (Binary Coded Decimal) ha la particolarita' di consentire
l'utilizzo delle cifre decimali nei calcoli eseguiti dalla macchina.
Un numero BCD puo' essere di due tipi : compattato o non compattato.
Nel primo caso, ogni cifra occupa 4 bit (un half-byte), nel secondo caso un byte
intero.
Pero' essendo le cifre decimali comprese tra 0 e 9 esse risiederanno sempre
nello spazio di 4 bit (nel caso non compattato i 4 bit piu' significativi del
byte valgono 0).
Ma essendo lo spazio di 4 bit capace di contenere non 10, ma 16 valori diversi,
c'e' un "surplus" di 16-10 = 6 valori inutilizzati.
Quindi, per esempio, eseguendo un'addizione, se il risultato e' superiore a 9,
ad esso viene sommato 6 in modo da far rientrare la cifra singola (escludendo il
riporto) nell'intervallo da 0 a 9.
Questo e' cio' che si intende per "aggiustamento".
L'istruzione AAA (Adjust After Addition), per farti un esempio, "aggiusta" il
risultato binario di un' addizione per renderlo BCD non compattato.
Se per esempio avessi le seguenti linee di codice macchina :
xor ax, ax  /* azzero il registro a 16 bit AX */
            /* in AX adesso c'e' il valore 0x0000  */
mov al, 9   /* metto in AL il numero 9 */
mov bl, 3   /* metto in BL il numero 3 */
add al, bl  /* eseguo la normale addizione del tipo AL = AL + BL */
            /* in AX adesso c'e' il valore 0x000C  */
            /* N.B.  AF = 1 */
aaa         /* trasformo il valore 12 in AL in un numero BCD non compattato */
            /* in AX adesso c'e' il valore 0x0102  */
            /* N.B.  AF = 0 */
Le altre operazioni che riguardano, rispettivamente, la divisione,
moltiplicazione e sottrazione sono AAD, AAM e AAS.
Spero di essermi spiegato bene ... ;)
Andrea Laforgia
---------------
(grattatio pallarum omnia mala fugit)
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

 Cos'è un aggiustamento in un'operazione aritmetica?
Quel flag dovrebbe indicare che c'è un riporto tra una cifra e l'altra
BCD, praticamente il riporto dal bit 3 al bit 4.
EMG

BCD, praticamente il riporto dal bit 3 al bit 4.
Attenzione pero', quello che dice EMG e' vero, tuttavia il fatto che vi sia
riporto tra il bit 3 e il bit 4 non comporta necessariamente riporto tra due
cifre BCD.
Mi spiego : AF indica se c'e' bisogno di "aggiustamento".
Ad esempio se i due numeri BCD fossero 7 e 1 avremmo 
0111 + 
0001
----
1000
In questo caso c'e' riporto tra il bit 3 e il bit 4 ma non vi e' bisogno di
aggiustamento (quindi AF = 0) .


 aggiustamento (quindi AF = 0) .
Aspetta: nel tuo esempio il riporto č dal bit 2 al bit 3 e non dal 3 al
4. Ricorda che i bit normalmente sono numerati a partire da zero.
EMG

4. Ricorda che i bit normalmente sono numerati a partire da zero.
Hai ragione, pero' pensavo che tu per primo te ne fossi dimenticato ;) , dato
che in questo caso il tuo ragionamento non e' piu' valido.
Ovvero, se numeri i bit a partire da 0, cosi' come giustamente va fatto, 
il riporto tra due cifre BCD non implica riporto tra i bit 3 e 4.
In quanto il riporto tra due cifre BCD si ha quando si supera il 9, mentre tra i
bit 3 e 4 quando si supera il 15.
La somma di due cifre BCD puo' superare quindici (9+7 per esempio) come puo' non
farlo (9+2 per esempio).
In entrambi i casi c'e' bisogno di aggiustamento (AF = 1) ma nel primo caso c'e'
riporto tra i bit 3 e 4, nel secondo no.


 il riporto tra due cifre BCD non implica riporto tra i bit 3 e 4.
Hai perfettamente ragione.
EMG