2009-09-10 100 views
13

Por lo que he leído, parece que hay 9 banderas diferentes. ¿Es posible leer/cambiarlos directamente? Sé que puedo saber, por ejemplo, si la bandera se pone a cero después de hacer una instrucción cmp/JMP, pero estoy preguntando si es posible hacer algo como¿Cómo se leen y escriben las banderas x86 se registra directamente?

mov eax, flags 

o algo así.

Además, para escribir, ¿es posible configurarlas a mano?

+0

relacionadas: https://en.wikipedia.org/wiki/FLAGS_register tiene un mapa de qué bandera es donde después de 'pushf' o' lahf'. –

Respuesta

27

Algunas banderas se pueden fijar o despejar directamente con instrucciones específicas:

  • CLC, STC y CMC: clara, set y complementan la bandera de acarreo
  • CLI y STI: claro y establezca la interrupción bandera (que se debería hacer atómicamente)
  • CLD y STD: clara y establecer el indicador de dirección

Para leer y escribir las banderas de signo, cero, acarreo auxiliar, paridad y acarreo, puede usar LAHF para cargar los 8 bits más bajos (esos 5 indicadores más 3 bits indeterminados) en el registro AH, y puede usar SAHF para almacenar esos valores de AH nuevamente en el registro de banderas.

También puede usar la instrucción PUSHF para insertar las banderas en la pila, leerlas y modificarlas en la pila, y luego usar la instrucción POPF para almacenarlas nuevamente en el registro de banderas.

Tenga en cuenta que no puede establecer los indicadores VM y RF con POPF, ya que conservan sus valores anteriores. De forma similar, solo puede cambiar el nivel de privilegio de E/S cuando se ejecuta en el nivel de privilegio 0, y el indicador de interrupción solo se puede cambiar cuando se ejecuta en un nivel de privilegio al menos tan privilegiado como el nivel de privilegio de E/S.

+4

Más precisamente: el manual de Intel clasifica cada indicador como: estado, control o sistema. Los indicadores del sistema no pueden ser modificados por aplicaciones de usuario. –

8

Puede usar las instrucciones de pushf y popf que presionarán las banderas en la pila, puede modificarlas y luego reactivarlas.

5

Si solo necesita el byte inferior del registro de banderas (que contiene SF, ZF, AF, PF, CF), existe la instrucción impar pero conveniente LAHF (ja, ja), que carga los 8 bits inferiores de las banderas se registran en AH, y su contraparte SAHF para almacenar AH en banderas.

Para la bandera de transporte específicamente, x86 ofrece CLC, STC y CMC, para borrar, establecer y complementar la bandera de acarreo, respectivamente.

0
  • LAHF: Indicadores de estado se carga en AH
  • Copia el byte bajo del registro EFLAGS incluyendo signo, cero, y seguir las banderas.
  • Guardar una copia de las banderas en una variable para su custodia

    .data 
    saveflags BYTE ? 
    .code 
    lahf ; load flags into AH 
    mov saveflags,ah ; save them into a variable 
    
  • SAHF: las tiendas AH en los indicadores de estado

  • Copias AH en el byte bajo del registro EFLAGS
  • recuperar el valor de banderas almacenado anteriormente

    .code 
    mov ah, saveflags ; load save flags into AH 
    sahf ; copy into flags register 
    
1

SETcc

Esta familia de instrucciones es otra forma de observar algunas banderas/combinación de banderas. Por ejemplo, para CF:

stc 
setc al 
; al == 1 

clc 
setc al 
; al == 0 

Jcc

Esta familia instrucción es, por supuesto, otra posibilidad para ciertas banderas, y podría ser utilizado para implementar SETcc:

jc set 
mov al, 0 
jmp end 
set: 
mov al, 1 
end: 
Cuestiones relacionadas