Registro de banderas

El registro de bandera o  palabra de estado del procesador (CSP) es un registro especializado que refleja el estado actual del procesador.

arquitectura x86

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.

Banderas de estado activas

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.

Bandera de control

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

Indicadores del sistema y el campo IOPL

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.

Identificación del procesador

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 → 80286

Ademá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) → 80386

De 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 80486

Véase también

Notas

  1. 3.4.3. Registro EFLAGS // Manual del desarrollador de software de la arquitectura Intel IA-32. - Intel , 2004. - T. 1: Arquitectura Básica . Número de pedido: 253665-013
  2. 1 2 La instrucción CPUIDse agregó en versiones posteriores del procesador 80486 y el procesador Pentium. Consulte: CPUID - Identificación de la CPU // Manual del desarrollador de software de la arquitectura Intel IA-32. - Intel , 2004. - V. 2A: Referencia del conjunto de instrucciones, AM . Número de pedido: 253666-013
  3. 8.1.3. Bifurcación y movimientos condicionales en códigos de condición // Manual del desarrollador de software de la arquitectura Intel IA-32. - Intel , 2004. - Vol. 1: Arquitectura Básica. Número de pedido: 253665-013
  4. En la arquitectura P6 , se introdujeron instrucciones FCOMI, FCOMIPetc., que, como resultado de la comparación, establecen las banderas en el registro de banderas directamente. Anteriormente, esto no era posible, ya que el coprocesador se implementaba en un chip separado y solo a partir del 80486DX, el coprocesador comenzó a integrarse en el procesador.