El registro de bandera o palabra de estado del procesador (CSP) es un registro especializado que refleja el estado actual del procesador.
En los microprocesadores Intel 8086 , se llama FLAGS y es de 16 bits. Los registros extendidos EFLAGS y RFLAGS, introducidos en las arquitecturas IA-32 ( procesadores 80386 ) y x86-64 , son de 32 bits y 64 bits, respectivamente. Los registros extendidos son compatibles con versiones anteriores.
El registro de banderas contiene un grupo de banderas de estado, una bandera de control y un grupo de banderas del sistema [1] :
Registro de bandera Intel x86 | |||||
---|---|---|---|---|---|
poco, no. | Designacion | Nombre | Descripción | tipo de bandera | cuando se introdujo |
BANDERAS | |||||
0 | FC | Llevar bandera | Llevar bandera | Estado | |
una | una | Reservado | |||
2 | FP | Bandera de paridad | Bandera de paridad | Estado | |
3 | 0 | Reservado | |||
cuatro | FA | Bandera de transporte auxiliar | Bandera de acarreo auxiliar | Estado | |
5 | 0 | Reservado | |||
6 | ZF | bandera cero | bandera cero | Estado | |
7 | SF | signo bandera | firmar bandera | Estado | |
ocho | TF | Bandera de trampa | Indicador de seguimiento (paso a paso) | sistémico | |
9 | SI | Indicador de activación de interrupción | Indicador de habilitación de interrupción | sistémico | |
diez | D.F. | Bandera de dirección | Bandera de dirección | Gerente | |
once | DE | Indicador de desbordamiento | bandera de desbordamiento | Estado | |
12 | IOPL | Nivel de privilegio de E/S | Nivel de prioridad de E/S | sistémico | 80286 |
13 | |||||
catorce | Nuevo Testamento | Tarea anidada | Indicador de anidamiento de tareas | sistémico | 80286 |
quince | 0 | Reservado | |||
BANDERAS | |||||
dieciséis | RF | Reanudar bandera | reanudar la bandera | sistémico | 80386 |
17 | máquina virtual | Modo Virtual-8086 | modo de procesador virtual 8086 | sistémico | 80386 |
Dieciocho | C.A. | Comprobación de alineación | Comprobación de alineación | sistémico | 80486SX _ |
19 | V.F.I. | Indicador de interrupción virtual | Indicador de habilitación de interrupción virtual | sistémico | pentium |
veinte | VIP | Pendiente de interrupción virtual | Interrupción virtual pendiente | sistémico | pentium |
21 | IDENTIFICACIÓN | Bandera de identificación | Comprobación de la disponibilidad de instruccionesCPUID | sistémico | Tarde 80486 [2] |
22 | 0 | reservado | |||
… | |||||
31 | |||||
BANDERA | |||||
32 | 0 | reservado | |||
… | |||||
63 |
El valor de algunas banderas en el registro de banderas se puede cambiar directamente, utilizando instrucciones especiales (por ejemplo, CLDpara restablecer la bandera de dirección), pero no hay instrucciones que le permitan acceder (verificar o cambiar) el registro de banderas como un registro normal. . Sin embargo, es posible guardar el registro de bandera en la pila o en el registro (E)AX y restaurar el registro de bandera desde ellos usando las instrucciones LAHF, SAHF, PUSHF, PUSHFDy . POPFPOPFD
Cuando se suspende una tarea (usando las capacidades multitarea del procesador), el procesador guarda automáticamente el valor del indicador de registro en el TSS (segmento de estado de la tarea), cuando se activa una nueva tarea, el procesador carga el registro del indicador desde el TSS de la nueva tarea.
Cuando se activa un controlador de interrupciones o un controlador de excepciones , el procesador guarda automáticamente el valor del registro de banderas en la pila actual.
Los indicadores de estado (bits 0, 2, 4, 6, 7 y 11) reflejan el resultado de ejecutar instrucciones aritméticas como ADD, SUB, MUL, DIV.
De las banderas enumeradas, solo la bandera CF se puede cambiar directamente con las instrucciones STC, CLCy CMC. Además, las instrucciones de bit ( , y BT) BTScopian el bit especificado en el indicador CF. BTRBTC
Los indicadores de estado permiten que la misma instrucción aritmética produzca un resultado de tres tipos diferentes: entero decimal codificado en binario (BCD), con signo y sin signo. Si el resultado se considera un número sin signo, entonces la bandera CF muestra la condición de desbordamiento (llevar o pedir prestado), para un resultado con signo (en complemento a dos ), el acarreo o préstamo muestra la bandera OF, y para el resultado BCD, el acarreo/ pedir prestado muestra la bandera AF. La bandera SF refleja el signo de un resultado firmado, la bandera ZF refleja tanto un resultado nulo sin firmar como uno firmado.
En la aritmética de enteros largos, la bandera CF se utiliza junto con las instrucciones de suma con acarreo ( ADC) y resta con préstamo ( SBB) para propagar un acarreo o préstamo de un bit calculado de un número largo a otro.
Las instrucciones de salto condicional (saltar en la condición cc , por ejemplo, para saltar si el resultado es distinto de cero), (establecer el valor del byte del resultado según la condición cc ), (bucle) y (copia condicional) usan una o más banderas de estado para verificar los términos. Por ejemplo, la instrucción de salto (saltar si es menor o igual - saltar si es “menor o igual que”, ≤) comprueba la condición “ZF=1 o SF ≠ OF”. JccJNZSETccLOOPccCMOVccJLE
El indicador PF se introdujo por compatibilidad con otras arquitecturas de microprocesadores y rara vez se usa para el propósito previsto. Es más común usarlo junto con otras banderas de estado en la aritmética de punto flotante [3] : las instrucciones de comparación ( FCOM, FCOMPetc.) en el coprocesador matemático establecen las banderas de condición C0, C1, C2 y C3 en él, y estas banderas se puede copiar al registro de banderas. Para hacer esto, se recomienda utilizar una instrucción FSTSW AXpara almacenar la palabra de estado del coprocesador en el registro AX y una instrucción SAHFpara copiar posteriormente el contenido del registro AH en los 8 bits inferiores del registro de bandera [4] , mientras que C0 pasa a la bandera CF, C2 en PF y C3 en ZF. El indicador C2 se establece, por ejemplo, en el caso de argumentos incomparables (NaN o formato no compatible) en la instrucción de comparación FUCOM.
El indicador de dirección (DF, bit 10 en el registro de indicadores) controla las instrucciones de cadena ( , , y MOVS) CMPS: SCASestablecer el indicador hace que las direcciones disminuyan (procesar líneas de direcciones altas a bajas), poner a cero hace que las direcciones aumenten. Las instrucciones y establecen y restablecen la bandera DF, respectivamente. LODSSTOSSTDCLD
Los indicadores del sistema y el campo IOPL controlan el entorno operativo y no están destinados a ser utilizados en programas de aplicación.
En versiones posteriores del procesador 80486, apareció la instrucción CPUID , que le permite identificar el procesador en el que se ejecuta el programa. En procesadores anteriores, para la identificación, es necesario analizar el comportamiento de las instrucciones, incluido el registro de banderas.
Por ejemplo, en los procesadores 8086 y 80186 , los bits 12-15 del registro de bandera siempre están establecidos, en los procesadores 80286 y posteriores, los bits 12-14 contienen el campo IOPL y la bandera NT, y siempre se borran en modo real . Esto permite distinguir entre procesadores 808x/8018x, 80286 y 80386 (y más nuevos) en código de 16 bits:
Código de lenguaje ensamblador MASM para distinguir entre procesadores 8086 - 80386 empujar ; (Mantener estado de registro de marca inicial) pushf ; Copiar el caso de la bandera... pop hacha ; ...para registrar AX xor ah , 11110000 b ; Cambie el valor del hacha de empuje de 4 bits altos ; Copiar registro AX popf ; ... al registro de banderas pushf ; Copiar el caso de la bandera... pop bx ; ...para registrar BX popf ; (Restablecer registro de bandera) xor ah , bh ; AH=0 (los bits en el registro de bandera no cambian) → 808x-80286, de lo contrario 80386+ y bh , 11110000 b ; BH=F0h (los 4 bits establecidos) → 808x/8018x, 0 → 80286Además, el indicador AC (bit 18) introducido en 80486 siempre se borra en 80386, lo que permite distinguir entre estos procesadores:
Código de lenguaje ensamblador MASM para distinguir entre los procesadores 80386 y 80486 y sp , no 3 ; Alinee la pila para que no haya errores de alineación al acceder a ella pushfd ; (Mantener el estado inicial del registro de bandera) pushfd ; Copiar el caso de la bandera... pop eax ; ...para registrar EAX xor eax , 40000 h ; Cambiar el valor del bit 18 (bandera AC) push eax ; Copiar registro EAX popfd ; ... al registro de banderas pushfd ; Copiar banderas de registro... pop ecx ; ...al registro ECX popfd ; (Reiniciar registro de marca) xor eax , ecx ; EAX=0 (el bit en el registro de bandera no cambia) → 80386De manera similar, en los modelos 80486 más antiguos donde CPUIDaún no se ha ingresado la instrucción, el indicador de ID (bit 21) siempre se borra, lo que permite la identificación de los procesadores 80386 y los modelos 80486 más antiguos:
Código de lenguaje ensamblador MASM para definir el antiguo 80486 empujar ; (Mantener el estado inicial del registro de bandera) pushfd ; Copiar el caso de la bandera... pop eax ; ...al registro EAX mov ecx , eax ; ...y en el registro ECX o eax , 200000 h ; Establezca el bit 21 (bandera de ID) presione eax ; Copiar registro EAX popfd ; ... al registro de banderas pushfd ; Copiar el caso de la bandera... pop eax ; ...al registro EAX popfd ; (Reiniciar registro de marca) xor eax , ecx ; EAX=0 (bit en el registro de bandera no establecido) → 80386/antiguo 80486Tecnologías de procesadores digitales | |||||||||
---|---|---|---|---|---|---|---|---|---|
Arquitectura | |||||||||
Set de instrucciones arquitectura | |||||||||
palabra maquina | |||||||||
Paralelismo |
| ||||||||
Implementaciones | |||||||||
Componentes | |||||||||
Administración de energía |