# Flag

In informatica, un flag (parola inglese che letteralmente significa bandiera) è una variabile, solitamente booleana, che può assumere solo due stati (identificabili come "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. I flag vengono impiegati dai programmatori per eseguire determinate operazioni solo al raggiungimento di un determinato stato o al verificarsi di un determinato evento.
L'operazione di porre il valore di un flag a "vero" viene detta impostare il flag, mentre quella di porlo nello stato di "falso" viene detta resettare o azzerare il flag.
Per verificare il raggiungimento dello stato desiderato si effettuano uno o più controlli riguardo al valore del flag nel codice e si cambia il valore del flag solo al raggiungimento dello stato desiderato. Quando, alla verifica del valore del flag, questo risulti essere il cosiddetto valore sentinella (solitamente quello che indica lo stato di "vero" per i flag booleani), si procede eseguendo le necessarie operazioni.
Un esempio tipico è l'utilizzo di una variabile di flag booleana chiamata "trovato" (o con altri nomi simili che la rendono di facile identificazione) all'interno di un algoritmo di ricerca. Questa variabile viene inizialmente impostata al valore "falso" e poi cambiata in "vero" solo quando viene trovato l'elemento ricercato. L'algoritmo termina con esito positivo o negativo a seconda che il flag "trovato" abbia assunto, rispettivamente, valore "vero" o "falso".
Altri esempi di utilizzo di flag sono le variabili semaforo usate all'interno dei sistemi operativi per sincronizzare l'accesso alle risorse.

## Flag nelle CPU

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 tali 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.

### Flag della CPU Intel 80386

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 come risultato un numero binario pari, in senso booleano (cioè l'ultimo bit è 0) |
| 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 INT 01 (Interrupt 1): 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 0 (Tramite l'istruzione CLI), la CPU non risponde più ai normali interrupt (a eccezione dei "Non-maskable interrupts"). Viene modificato dal programma in esecuzione. |
| 10 | DF | Flag Direzione: se posto a 1, le cosiddette "istruzioni di stringa" (per esempio LODSB) 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). |