El registro FLAGS es el registro de estado que contiene el estado actual de una CPU x86 . El tamaño y el significado de los bits de los indicadores dependen de la arquitectura. Por lo general, refleja el resultado de las operaciones aritméticas, así como información sobre las restricciones impuestas a la operación de la CPU en el momento actual. Algunas de esas restricciones pueden incluir la prevención de la activación de algunas interrupciones y la prohibición de la ejecución de una clase de instrucciones "privilegiadas". Los indicadores de estado adicionales pueden eludir la asignación de memoria y definir qué acción debe tomar la CPU en caso de desbordamiento aritmético.
Los indicadores de acarreo, paridad, acarreo auxiliar (o medio acarreo ), cero y signo están incluidos en muchas arquitecturas (muchas arquitecturas modernas (RISC) no tienen indicadores, como acarreo, e incluso si usan indicadores, entonces el medio acarreo es raro, ya que la matemática BCD ya no es común, e incluso tiene soporte limitado en modo largo en x86-64 ).
En la arquitectura i286 , el registro tiene 16 bits de ancho. Sus sucesores, los registros EFLAGS y RFLAGS (en el x86-64 moderno ), tienen 32 y 64 bits de ancho, respectivamente. Los registros más anchos mantienen la compatibilidad con sus predecesores más pequeños.
Nota: La columna de máscara en la tabla es la máscara de bits AND (como valor hexadecimal ) para consultar los indicadores dentro del valor del registro FLAGS.
Todos los registros FLAGS contienen los códigos de condición , bits de bandera que permiten que los resultados de una instrucción en lenguaje de máquina afecten a otra instrucción. Las instrucciones aritméticas y lógicas establecen algunas o todas las banderas, y las instrucciones de salto condicional toman una acción variable en función del valor de ciertas banderas. Por ejemplo, jz
(Saltar si es cero), jc
(Saltar si hay acarreo) y jo
(Saltar si hay desbordamiento) dependen de banderas específicas. Otros saltos condicionales prueban combinaciones de varias banderas.
Los registros FLAGS se pueden mover desde o hacia la pila. Esto es parte del trabajo de guardar y restaurar el contexto de la CPU, en comparación con una rutina como una rutina de servicio de interrupción cuyos cambios en los registros no deberían ser vistos por el código que realiza la llamada. A continuación se muestran las instrucciones pertinentes:
En el modo de 64 bits, están disponibles PUSHF/POPF y PUSHFQ/POPFQ, pero no PUSHFD/POPFD. [8] : 4–349, 4–432
Los 8 bits inferiores del registro FLAGS también están abiertos a la manipulación directa de carga/almacenamiento por SAHF y LAHF (carga/almacenamiento de AH en banderas).
La capacidad de insertar y extraer registros FLAGS permite que un programa manipule la información contenida en los FLAGS de maneras para las que no existen instrucciones en lenguaje de máquina. Por ejemplo, las instrucciones cld
y std
borran y establecen el indicador de dirección (DF), respectivamente; pero no hay ninguna instrucción que complemente al DF. Esto se puede lograr con el siguiente código ensamblador :
; Este es el código 8086, con registros de 16 bits insertados en la pila, ; y el registro de banderas tiene solo 16 bits con esta CPU. pushf ; Utiliza la pila para transferir las BANDERAS pop ax ; … al registro AX push ax ; y cópialas nuevamente en la pila para almacenarlas xor ax , 400h ; Alterna (invierte, 'complementa') solo el DF; los demás bits no cambian push ax ; Utiliza la pila nuevamente para mover el valor modificado popf ; … al registro de BANDERAS ; Inserta aquí el código que requería que la bandera DF se complementara popf ; Restaura el valor original de las BANDERAS
Al manipular el registro FLAGS, un programa puede determinar el modelo del procesador instalado. Por ejemplo, el indicador de alineación solo se puede cambiar en el 486 y superiores. Si el programa intenta modificar este indicador y detecta que la modificación no se ha mantenido, el procesador es anterior al 486.
A partir del procesador Intel Pentium , la instrucción CPUID informa el modelo del procesador. Sin embargo, el método anterior sigue siendo útil para distinguir entre modelos anteriores.