Configuração de Registradores

De modo geral, uma configuração pode envolver a manipulação de apenas um bit ou de um conjunto de bits. A seguir serão demonstradas algumas situações envolvendo registradores de 8 bits.

Estabelecendo uns

Deseja-se configurar o registrador de modo que o bit 5 tenha o valor 1. Sem considerar os efeitos que um valor atribuído ao registrador pode causar, tal procedimento poderia ser executado da seguinte maneira:

REGISTRADOR = 32;

Valor 32? Nesse caso, 32 (2^5) é o mesmo que 100000 em binário. Isto é, somente o bit 5 está ativado. Outra maneira de realizar a mesma configuração é a seguinte.

REGISTRADOR = (1 << 5);

Pois, o valor 1 (decimal) representado no formato binário é 00000001. Agora, considere o valor 1 deslocado (<<) 5 vezes para a esquerda. Tal procedimento é chamado de máscara.

A cada deslocamento:

  • O bit mais a esquerda é descartado.

  • O bit menos significativo é zero.

REGISTRADOR = (1 << 5);

  1. 00000001; valor atual

  2. 00000010; valor deslocado uma vez para esquerda

  3. 00000100; 2x

  4. 00001000; 3x

  5. 00010000; ...

  6. 00100000;

Problemas com o método anterior

De fato, o bit 5 teve o valor configurado no exemplo anterior. No entanto, a atribuição do valor 32 ou (1 << 5) estabeleceu todos os bits com valor zero, com exceção do bit 5. Nesse ponto, é importante lembrar que um registrador mantém uma determinada configuração e qualquer modificação implica em uma nova configuração.

Assim, tais operações devem manipular somente os bits necessários. Isto é, deve-se manter a configuração anterior e modificar somente o necessário. O cenário agora é o seguinte: o valor que será atribuído corresponde ao valor do próprio registrador mais o da modificação desejada.

REGISTRADOR = REGISTRADOR OPERADOR MÁSCARA;

Qual operador deve ser utilizado? O operador lógico OR (símbolo | na linguagem C).

REGISTRADOR = REGISTRADOR | (1 << 5);

Tal operação é realizada bit a bit entre os dois valores. O resultado da operação OR será zero somente se os dois bits foram iguais a zero. Considere que o registrador está com o valor 3. O resultado dessa operação é o seguinte:

REGISTRADOR

00000011

MÁSCARA

00100000

Resultado:

00100011

Observe que o resultado consiste dos bits que estavam em 1 (valor anterior) mais os bits ativados da máscara. Em outras palavras, são modificados apenas os bits que estão em um na máscara.

Estabelecendo zeros

Da mesma maneira, o procedimento de manipulação de bits pode ser utilizado para colocar em zero um conjunto de bits. Basicamente, esse procedimento é o oposto do demonstrado anteriormente e utiliza os operadores NOT e AND.

Considere que o registrador está com o valor 35 (00100011, resultado do exemplo anterior). Utilizaremos o complemento (NOT) da máscara corresponde ao bit que será posto em zero. Nesse caso, deseja-se colocar em zero o bit 5. O resultado é dado pela operação AND que resulta em zero sempre que um dos bits é zero.

REGISTRADOR

00100011

NOT(MÁSCARA)

11011111

Resultado:

00000011

O complemento da máscara estabelece todos os bits em 1, exceto aqueles que serão manipulados. Com a operação AND, somente esses bits em zero alterarão o valor do registrador.

Na linguagem C, os operadores NOT e AND são representados pelos símbolos ~ e &.

REGISTRADOR = REGISTRADOR & ~(1 << 5);

Comutação de nível lógico

Para inverter o estado de um bit utiliza-se o operador XOR. Na linguagem C, o operador XOR é representado pelo símbolo ^. Tal operação resulta em zero sempre os bits envolvidos tem o mesmo valor. Assim, são modificados apenas os bits que estão em um na máscara.

REGISTRADOR = REGISTRADOR | (1 << 5)

00100011

REGISTRADOR = REGISTRADOR ^ (1 << 5)

00000011

REGISTRADOR = REGISTRADOR ^ (1 << 5)

00100011

REGISTRADOR = REGISTRADOR ^ (1 << 5)

00000011