El registro FLAGS es el registro de estado en los microprocesadores Intel x86 que contiene el estado actual del procesador. Este registro tiene 16 bits de ancho. Sus sucesores, los registros EFLAGS y RFLAGS , tienen 32 bits y 64 bits de ancho, respectivamente. Los registros más amplios conservan la compatibilidad con sus predecesores más pequeños.
Los bits fijos en las posiciones de bit 1, 3 y 5, y los indicadores de acarreo, paridad, ajuste, cero y signo se heredan de una arquitectura incluso anterior, 8080 y 8085 . El indicador de ajuste solía llamarse bit de acarreo auxiliar en 8080 y bit de medio acarreo en la arquitectura Zilog Z80 .
BANDERAS
Registro de BANDERAS Intel x86 [1] | ||||||
---|---|---|---|---|---|---|
Un poco # | Máscara | Abreviatura | Descripción | Categoría | = 1 | = 0 |
BANDERAS | ||||||
0 | 0x0001 | CF | Llevar bandera | Estado | CY (llevar) | NC (sin transporte) |
1 | 0x0002 | Reservado, siempre 1 en EFLAGS [2] [3] | ||||
2 | 0x0004 | PF | Bandera de paridad | Estado | PE (paridad par) | PO (paridad impar) |
3 | 0x0008 | Reservado [3] | ||||
4 | 0x0010 | AF | Ajustar bandera | Estado | AC (transporte auxiliar) | NA (sin transporte auxiliar) |
5 | 0x0020 | Reservado [3] | ||||
6 | 0x0040 | ZF | Bandera cero | Estado | ZR (cero) | NZ (no cero) |
7 | 0x0080 | SF | Bandera de signo | Estado | NG (negativo) | PL (positivo) |
8 | 0x0100 | TF | Bandera de trampa (un solo paso) | Control | ||
9 | 0x0200 | SI | Bandera de habilitación de interrupciones | Control | EI (habilitar interrupción) | DI (Deshabilitar interrupción) |
10 | 0x0400 | DF | Bandera de dirección | Control | DN (abajo) | Subir Subir) |
11 | 0x0800 | DE | Bandera de desbordamiento | Estado | OV (desbordamiento) | NV (sin desbordamiento) |
12-13 | 0x3000 | IOPL | Nivel de privilegio de E / S (solo 286+), siempre 1 [ aclaración necesaria ] en 8086 y 186 | Sistema | ||
14 | 0x4000 | Nuevo Testamento | Indicador de tarea anidada (solo 286+), siempre 1 en 8086 y 186 | Sistema | ||
15 | 0x8000 | Reservado, siempre 1 en 8086 y 186, siempre 0 en modelos posteriores | ||||
EFLAGS | ||||||
dieciséis | 0x0001 0000 | RF | Bandera de reanudación (solo 386+) | Sistema | ||
17 | 0x0002 0000 | VM | Indicador de modo virtual 8086 (solo 386+) | Sistema | ||
18 | 0x0004 0000 | C.A. | Comprobación de alineación (solo 486SX +) | Sistema | ||
19 | 0x0008 0000 | VIF | Bandera de interrupción virtual (Pentium +) | Sistema | ||
20 | 0x0010 0000 | VIP | Interrupción virtual pendiente (Pentium +) | Sistema | ||
21 | 0x0020 0000 | IDENTIFICACIÓN | Capaz de utilizar la instrucción CPUID (Pentium +) | Sistema | ||
22‑31 | 0xFFC0 0000 | Reservado | Sistema | |||
RFLAGS | ||||||
32‑63 | 0xFFFF FFFF …… 0000 0000 | Reservado |
Nota: La columna de máscara en la tabla es la máscara de bits AND (como valor hexadecimal ) para consultar la (s) bandera (s) dentro del valor del registro FLAGS.
Uso
Todos los registros FLAGS contienen los códigos de condición , bits de banderas 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 algunos o todos los indicadores, y las instrucciones de salto condicional realizan una acción variable basada en el valor de ciertos indicadores. Por ejemplo, jz
(Jump if Zero), jc
(Jump if Carry) y jo
(Jump if Overflow) 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 del procesador, contra una rutina como una rutina de servicio de interrupción cuyos cambios en los registros no deberían ser vistos por el código de llamada. Aquí están las instrucciones relevantes:
- Las instrucciones PUSHF y POPF transfieren el registro FLAGS de 16 bits.
- PUSHFD / POPFD (introducido con la arquitectura i386 ) transfiere los EFLAGS de doble registro de 32 bits.
- PUSHFQ / POPFQ (introducido con la arquitectura x64 ) transfiere el registro de cuatro palabras RFLAGS de 64 bits.
En el modo de 64 bits, PUSHF / POPF y PUSHFQ / POPFQ están disponibles, pero PUSHFD / POPFD no. [4] : 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 parte de SAHF y LAHF (cargar / almacenar AH en banderas).
Ejemplo
La capacidad de presionar y abrir registros FLAGS permite a un programa manipular información en los FLAGS de formas para las que no existen instrucciones en lenguaje de máquina. Por ejemplo, las instrucciones cld
y std
borran y establecen la bandera de dirección (DF), respectivamente; pero no hay instrucciones para complementar DF. Esto se puede lograr con el siguiente código de ensamblaje :
pushf ; Usa la pila para transferir el hacha pop FLAGS ; ... en el registro AX push axe ; y cópielos de nuevo en la pila para almacenamiento xor ax , 400h ; Alternar (complementar) DF solamente; otros bits son sin cambios empuje hacha ; Use la pila nuevamente para mover el valor modificado popf ; ... en el registro FLAGS ; Inserte aquí el código que requería que la bandera DF se complementara popf ; Restaurar el valor original de las BANDERAS
Al manipular el registro FLAGS, un programa puede determinar el modelo del procesador instalado. Por ejemplo, la bandera de alineación solo se puede cambiar en el 486 y superior. Si el programa intenta modificar este indicador y detecta que la modificación no persistió, el procesador es anterior al 486.
Comenzando con 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.
Ver también
- Campo de bits
- Registro de control
- Indicador de CPU (x86)
- Palabra de estado del programa
- Registro de estado
- lenguaje ensamblador x86
- listados de instrucciones x86
Referencias
- ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 (PDF) . 1 . Mayo de 2012. págs. 3–21.
- ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 (PDF) . 1 . Diciembre de 2016. p. 78.
- ^ a b c "Ingeniería inversa de silicio: banderas indocumentadas del 8085" . www.righto.com . Consultado el 21 de octubre de 2018 .
- ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 (PDF) . 2B . Mayo de 2012.