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 come risultato un numero binario pari, in senso boleano (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). |

