stringtranslate.com

Registro de BANDERAS

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 bandera dependen de la arquitectura. Por lo general, refleja el resultado de operaciones aritméticas, así como información sobre las restricciones impuestas al funcionamiento de la CPU en el momento actual. Algunas de esas restricciones pueden incluir evitar que se activen algunas interrupciones y prohibir la ejecución de una clase de instrucciones "privilegiadas". Los indicadores de estado adicionales pueden omitir el mapeo de memoria y definir qué acción debe realizar la CPU en caso de desbordamiento aritmético.

Las banderas de acarreo, paridad, acarreo auxiliar (o medio acarreo ), cero y signo están incluidas en muchas arquitecturas (muchas arquitecturas modernas (RISC) no tienen banderas, como acarreo, e incluso si usan banderas, entonces el acarreo medio es raro, ya que las matemáticas BCD ya no son comunes e incluso tienen 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 x86-64 moderno ), tienen 32 bits y 64 bits de ancho, respectivamente. Los registros más anchos conservan la compatibilidad con sus predecesores más pequeños.

BANDERAS

Nota: La columna de máscara en la tabla es la máscara de bits AND (como valor hexadecimal ) para consultar las banderas dentro del valor del registro FLAGS.

Uso

Todos los registros FLAGS contienen 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 acciones variables según el valor de ciertas banderas. Por ejemplo, jz(Saltar si es cero), jc(Saltar si lleva) y jo(Saltar si se desborda) dependen de indicadores específicos. 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, frente a una rutina como una rutina de servicio de interrupción cuyos cambios en los registros no deben ser vistos por el código de llamada. Aquí están las instrucciones relevantes:

En modo de 64 bits, PUSHF/POPF y PUSHFQ/POPFQ están disponibles pero PUSHFD/POPFD no. [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 parte de SAHF y LAHF (carga/almacenamiento de AH en banderas).

Ejemplo

La capacidad de insertar y extraer registros FLAGS permite que un programa manipule información en FLAGS de maneras para las cuales no existen instrucciones en lenguaje de máquina. Por ejemplo, las instrucciones cldy stdborran y configuran la bandera de dirección (DF), respectivamente; Pero no hay instrucciones para complementar 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 es de sólo 16 bits con esta CPU. empujar ; Utilice la pila para transferir el hacha pop FLAGS ; … en el registro AX , presione ax ; y cópielos nuevamente en la pila para almacenamiento xor ax , 400h ; Alternar (invertir, 'complementar') únicamente el DF; otros bits no cambian el hacha de empuje ; Utilice la pila nuevamente para mover el valor modificado popf ; … en el registro FLAGS ; Inserte aquí el código que requirió que la bandera DF fuera complementada popf ; Restaurar el valor original de FLAGS             

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 486 y superiores. Si el programa intenta modificar este indicador y detecta que la modificación no persistió, el procesador es anterior al 486.

A partir del 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

Referencias

  1. ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 (PDF) . vol. 1. Mayo de 2012. págs. 3–21.
  2. ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 (PDF) . vol. 1. Diciembre de 2016. p. 78.
  3. ^ abc "Ingeniería inversa del silicio: banderas indocumentadas del 8085". www.righto.com . Consultado el 21 de octubre de 2018 .
  4. ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, vol. 1. Diciembre de 2022. págs. 3-16.
  5. ^ NEC, Manual del usuario de la serie V de 16 bits, documento no. U11301E, septiembre de 2000, pág. 186
  6. ^ VIA, Guía de programación de PadLock, v1.66, 4 de agosto de 2005, págs. Archivado desde el original el 26 de mayo de 2010.
  7. ^ Nota de aplicación del conjunto de instrucciones alternativas del procesador VIA, VIA C3, versión 0.24, 2002; consulte la figura 2 en la página 12 y el capítulo 4 en la página 21 para obtener detalles sobre el indicador EFLAGS.AI.
  8. ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 (PDF) . vol. 2B. Mayo de 2012.