Flags do processador

Registrador EFLAGS e FLAGS.

O registrador EFLAGS contĆ©m flags que servem para indicar trĆŖs tipos de informaƧƵes diferentes:

  • Status -- Indicam o resultado de uma operaĆ§Ć£o aritmĆ©tica.

  • Control -- Controlam alguma caracterĆ­stica de execuĆ§Ć£o do processador.

  • System -- Servem para configurar ou indicar alguma caracterĆ­stica do hardware relacionado a execuĆ§Ć£o do cĆ³digo ou do sistema.

Enquanto o RFLAGS de 64 bits contĆ©m todas as mesmas flags de EFLAGS sem nenhuma nova. Todos os 32 bits mais significativos do RFLAGS estĆ£o reservados e sem nenhum uso atualmente. Observe a figura abaixo retirada do Intel Developer's Manual Vol. 1, mostrando uma visĆ£o geral do bits de EFLAGS:

Status Flags

InstruƧƵes que fazem operaƧƵes aritmĆ©ticas modificam as status flags conforme o valor do resultado da operaĆ§Ć£o. SĆ£o instruƧƵes como ADD, SUB, MUL e DIV por exemplo.

PorĆ©m um detalhe que Ć© interessante saber Ć© que existem duas instruƧƵes que normalmente sĆ£o utilizadas para definir essas flags para serem usadas junto com uma instruĆ§Ć£o condicional. Elas sĆ£o: CMP e TEST. A instruĆ§Ć£o CMP nada mais Ć© do que uma instruĆ§Ć£o que faz a mesma operaĆ§Ć£o aritmĆ©tica de subtraĆ§Ć£o que SUB porĆ©m sem modificar o valor dos operandos.

Enquanto TEST faz uma operaĆ§Ć£o bitwise AND (E bit a bit) tambĆ©m sem modificar os operandos. Ou seja, o mesmo que a instruĆ§Ć£o AND. Veja a tabela abaixo com todas as status flags:

Bit

Nome

Sigla

DescriĆ§Ć£o

0

Carry Flag

CF

Setado se uma condiĆ§Ć£o de Carry ou Borrow acontecer no bit mais significativo do resultado. Basicamente indica o overflow de um valor nĆ£o-sinalizado.

2

Parity Flag

PF

ā€‹Setado se o byte menos significativo do resultado conter um nĆŗmero par de bits ligados (1).

4

Auxiliary Carry Flag

AF

Setado se uma condiĆ§Ć£o de Carry ou Borrow acontecer no bit 3 do resultado.

6

Zero Flag

ZF

Setado se o resultado for zero.

7

Sign Flag

SF

Setado para o mesmo valor do bit mais significativo do resultado (MSB). Onde 0 indica um valor positivo e 1 indica um valor negativo.

11

Overflow Flag

OF

Setado se o resultado nĆ£o tiver o sinal esperado da operaĆ§Ć£o aritmĆ©tica. Basicamente indica o overflow de um nĆŗmero sinalizado.

Carry, ou carrinho/transporte, Ć© o que a gente conhece no Brasil como "vai um" em uma operaĆ§Ć£o aritmĆ©tica de adiĆ§Ć£o. Borrow Ć© o mesmo princĆ­pio porĆ©m em aritmĆ©tica de subtraĆ§Ć£o, em linguagem coloquial chamado de "pegar emprestado".

Dentre essas flags somente CF pode ser modificada diretamente e isso Ʃ feito com as seguintes instruƧƵes:

stc  ; (Set CF)        Seta o valor da Carry Flag
clc  ; (Clear CF)      Zera o valor da Carry Flag
cmc  ; (coMplement CF) Inverte o valor da Carry Flag

Control Flags

Bit

Nome

Sigla

DescriĆ§Ć£o

10

Direction Flag

DF

Controla a direĆ§Ć£o para onde as instruƧƵes de string (MOVS, SCAS, STOS, CMPS e LODS) irĆ£o decorrer a memĆ³ria.

Se DF estiver setada as instruƧƵes de string irĆ£o decrementar o valor do(s) registrador(es). Se estiver zerada ela irĆ” incrementar, que Ć© o valor padrĆ£o para essa flag.

std  ; (Set DF)    Seta o valor da Direction Flag
cld  ; (Clear DF)  Zera o valor da Direction Flag

Caso sete o valor dessa flag Ć© importante que a zere novamente em seguida. CĆ³digo compilado normalmente espera que por padrĆ£o essa flag esteja zerada. Comportamentos imprevistos podem acontecer caso vocĆŖ nĆ£o a zere depois de usar.

System Flags

As system flags podem ser lidas por qualquer programa porƩm somente o sistema operacional pode modificar seus valores (exceto ID). Abaixo irei falar somente das flags que nos interessam saber por agora.

Bit

Nome

Sigla

DescriĆ§Ć£o

8

Trap Flag

TF

Se setada o processador irĆ” executar as instruƧƵes do programa passo a passo. Nesse modo o processador dispara uma exception para cada instruĆ§Ć£o executada. Ɖ normalmente usada para depuraĆ§Ć£o de cĆ³digo.

9

Interrupt enable Flag

IF

Controla a resposta do processador para interrupƧƵes que podem ser ignoradas (interrupƧƵes mascarƔveis).

12-13

I/O Privilege Level field

IOPL

Indica o nĆ­vel de acesso para a comunicaĆ§Ć£o direta com o hardware (operaƧƵes de I/O) do programa atual.

14

Nested Task flag

NT

Se setada indica que a tarefa atual estĆ” vinculada com uma tarefa anterior. Essa flag controla o comportamento da instruĆ§Ć£o IRET.

16

Resume Flag

RF

Se setada as exceptions disparadas pelo processador sĆ£o temporariamente desabilitadas na instruĆ§Ć£o seguinte. Geralmente usada por depuradores.

17

Virtual-8086 Mode flag

VM

Em protected mode se essa flag for setada o processador entra em modo Virtual-8086.

21

Identification flag

ID

Se um processo conseguir setar ou zerar essa flag, isto indica que o processador suporta a instruĆ§Ć£o CPUID.

IOPL na verdade nĆ£o Ć© uma flag mas sim um campo de 2 bits que indica o nĆ­vel de privilĆ©gio de acesso para operaƧƵes de I/O a partir da porta fĆ­sica do processador.

As instruƧƵes abaixo podem ser utilizadas para modificar o valor de IF:

sti  ; (Set IF)   Seta o valor da Interrupt Flag
cli  ; (Clear IF) Zera o valor da Interrupt Flag

FLAGS (16-bit)

Em real mode dentre as system flags somente TF e IF existem e nĆ£o dependem de qualquer tipo de privilĆ©gio para serem modificadas, qualquer software executado pelo processador tem permissĆ£o irrestrita Ć s flags.

Last updated