Flag
Da Wikipedia, l'enciclopedia libera.
Un flag (parola inglese che significa bandierina) in informatica è una variabile che può assumere solo due stati ("vero" o "falso", "on" e "off", "1" e "0", "acceso" e "spento") e che segnala, con il suo valore, se un dato evento si è verificato oppure no, o se il sistema è in un certo stato oppure no (vedi anche voce in Glossario informatico).
Per esempio, nelle CPU sono presenti molti flag associati a operazioni matematiche, rappresentati con dei bit singoli organizzati in un importante registro apposito, il registro dei flag: fra i vari flag c'è il flag di zero, che assume il valore 1 ogni volta che l'ultima operazione matematica eseguita dalla CPU ha dato un risultato pari a zero, mentre assume il valore 0 se il risultato è stato un numero diverso da zero. Il valore dei vari flag viene usato nelle istruzioni di salto condizionato della CPU per decidere se saltare o meno.
L'operazione di porre il valore di un flag a "vero" viene detta impostare il flag, mentre porlo nello stato di "falso" viene detto resettare il flag.
[modifica] Flag della CPU 386
Ecco, come esempio dei flag di una CPU, il registro dei flag della CPU Intel 80386 e il loro significato:
Bit | Sigla | Descrizione |
---|---|---|
0 | CF | Flag di Carry: viene posto a 1 dalla CPU se l'ultima operazione ha generato un riporto (e in alcune altre occasioni) |
1 | 1 | valore fisso |
2 | PF | Flag di parità: viene posto a 1 dalla CPU se l'ultima operazione ha dato un risultato con parità pari in senso booleano (cioè con un numero pari di bit) |
3 | 0 | valore fisso |
4 | AF | Flag di Carry ausiliario: viene usato al posto del Carry normale nelle istruzioni di aritmetica BCD |
5 | 0 | valore fisso |
6 | ZF | Flag di Zero: viene posto a 1 dalla CPU se l'ultima operazione ha dato zero come risultato |
7 | SF | Flag di Segno: viene posto a 1 dalla CPU se il risultato dell'ultima operazione ha segno negativo (se interpretato in complemento a due) |
8 | TF | Flag di Trap: quando viene posto a 1, dopo ogni istruzione eseguita la CPU esegue automaticamente una istruzione INT01: viene impostato dai debugger per seguire l'esecuzione passo-passo dei programmi in fase di debugging. Viene modificato dal programma in esecuzione. |
9 | IF | Interrupt Flag: durante tutto il tempo che questo flag è posto a 1, la CPU non risponde più ai normali interrupt (a eccezione dell'NMI). Viene modificato dal programma in esecuzione. |
10 | DF | Flag Direzione: se posto a 1, le cosiddette "istruzioni di stringa" verranno eseguite in avanti, cioè con indirizzi di memoria crescenti: altrimenti accadrà il contrario. Viene modificato dal programma in esecuzione. |
11 | OF | Flag di Overflow: viene posto a 1 dalla CPU quando il risultato dell'ultima operazione è maggiore del massimo valore che il registro di destinazione può contenere. |
12 | IOPL (primo bit) | I/O Privilege level: a seconda del valore dei suoi due bit, il programma in esecuzione può eseguire le istruzioni di I/O sulle porte hardware. Se entrambi sono a 0 e il programma tenta di eseguire simili operazioni viene bloccato e viene generato un errore di protezione. Viene modificato dal sistema operativo. Non essendo un valore booleano, l'IOPL non è realmente un flag, tuttavia è ugualmente localizzato in questo registro. |
13 | IOPL (secondo bit) | |
14 | NT | Nested Task: questo flag è posto a 1 dalla CPU, e significa che il codice in esecuzione è la subroutine di servizio di un interrupt o di una eccezione e non può essere interrotta per passare ad un altro programma finché non termina (con l'istruzione IRET, che azzera anche il flag NT). Utile solo in multitasking in modo protetto. |
15 | 0 | valore fisso |
16 | RF | Resume Flag: se viene posto a 1, disabilita temporaneamente le eccezioni di debug. Utile per l'esecuzione passo-passo dei programmi: viene usato insieme al flag TF |
17 | VM | Virtual 8086 mode: se posto a 1, questo flag indica che si sta eseguendo il programma in modo "8086 virtuale" (emulazione). |