Registro de status - Status register

Um registrador de status , registrador de sinalizador ou registrador de código de condição ( CCR ) é uma coleção de bits de sinalizador de status para um processador . Exemplos de tais registros incluem o registro FLAGS na arquitetura x86 , sinalizadores no registro da palavra de status do programa (PSW) na arquitetura IBM System / 360 por meio de z / Architecture e o registro de status do programa de aplicativo (APSR) na arquitetura ARM Cortex-A .

O registro de status é um registro de hardware que contém informações sobre o estado do processador . Os bits individuais são lidos implícita ou explicitamente e / ou escritos pelas instruções do código de máquina em execução no processador. O registrador de status permite que uma instrução execute uma ação dependente do resultado de uma instrução anterior.

Normalmente, os sinalizadores no registrador de status são modificados como efeitos de operações aritméticas e de manipulação de bits. Por exemplo, um bit Z pode ser definido se o resultado da operação for zero e limpo se for diferente de zero. Outras classes de instruções também podem modificar os sinalizadores para indicar o status. Por exemplo, uma instrução de string pode fazer isso para indicar se a instrução terminou porque encontrou uma correspondência / incompatibilidade ou porque encontrou o final da string. Os sinalizadores são lidos por uma instrução condicional subsequente, de forma que a ação especificada (dependendo do processador, um salto, uma chamada, um retorno ou assim por diante) ocorra apenas se os sinalizadores indicarem um resultado especificado da instrução anterior.

Algumas arquiteturas de CPU, como MIPS e Alpha , não usam um registro de sinalizador dedicado. Outros não configuram e / ou lêem sinalizadores implicitamente. Essas máquinas não passam informações de status implícitas entre as instruções ou as passam em um registro de propósito geral selecionado explicitamente.

Um registrador de status pode frequentemente ter outros campos também, como sinalizadores mais especializados, bits de habilitação de interrupção e tipos semelhantes de informações. Durante uma interrupção, o status do thread atualmente em execução pode ser preservado (e posteriormente recuperado), armazenando o valor atual do registro de status junto com o contador do programa e outros registros ativos na pilha da máquina ou em alguma outra área reservada da memória.

Bandeiras comuns

Esta é uma lista dos sinalizadores de registro de status da CPU mais comuns, implementados em quase todos os processadores modernos.

Bandeira Nome Descrição
Z Bandeira zero Indica que o resultado de uma operação aritmética ou lógica (ou, às vezes, uma carga) foi zero.
C Carregar bandeira Permite que números maiores do que uma única palavra sejam adicionados / subtraídos carregando um dígito binário de uma palavra menos significativa para o bit menos significativo de uma palavra mais significativa, conforme necessário. Ele também é usado para estender trocas e rotações de bits de maneira semelhante em muitos processadores (às vezes feito por meio de um sinalizador X dedicado ).
S / N Sinalizar sinalizador Sinalizador
negativo
Indica que o resultado de uma operação matemática é negativo. Em alguns processadores, os sinalizadores N e S são distintos com significados e usos diferentes: um indica se o último resultado foi negativo, enquanto o outro indica se uma subtração ou adição ocorreu.
V / O / W Sinalizador de estouro Indica que o resultado com sinal de uma operação é muito grande para caber na largura do registro usando a representação de complemento de dois .

Outras bandeiras

Em alguns processadores, o registro de status também contém sinalizadores como estes:

Bandeira Nome Descrição
H / A / DC Sinalizador de meio transporte Sinalizador
auxiliar
Decimal de transporte de dígitos
sinalizador de ajuste
Indica que um bit carry foi produzido entre os nibbles (normalmente entre as metades de 4 bits de um operando de byte) como resultado da última operação aritmética. Esse sinalizador é geralmente útil para implementar operações aritméticas BCD em hardware binário.
P Bandeira de paridade Indica se o número de bits definidos do último resultado é ímpar ou par.
Eu Interromper bandeira Em alguns processadores, este bit indica se as interrupções estão habilitadas ou mascaradas. Se o processador tiver vários níveis de prioridade de interrupção , como o PDP-11 , vários bits podem ser usados ​​para indicar a prioridade do thread atual, permitindo que ele seja interrompido apenas pelo hardware definido para uma prioridade mais alta. Em outras arquiteturas, um bit pode indicar que uma interrupção está atualmente ativa e que o thread atual é parte de um manipulador de interrupção .
S Bandeira do supervisor Em processadores que fornecem dois ou mais anéis de proteção , um ou mais bits no registro de status indicam o anel do encadeamento atual (quão confiável ele é ou se deve usar o sistema operacional para solicitações que podem atrapalhar outros encadeamentos). Em um processador com apenas dois anéis, um único bit pode distinguir o modo Supervisor do modo Usuário.

Arquiteturas de CPU sem sinalizadores aritméticos

Os sinalizadores de status permitem que uma instrução atue com base no resultado de uma instrução anterior. Em processadores em pipeline , como processadores superescalares e especulativos , isso pode criar riscos que tornam o processamento lento ou exigem hardware extra para contorná-los.

Alguns processadores de texto com instruções muito longas dispensam os sinalizadores de status. Uma única instrução executa um teste e indica em qual resultado desse teste realizar uma ação, como Compare a com b e Jump to c se for igual. O resultado do teste não é salvo para instruções subsequentes.

Outra alternativa ao registro de status é que as instruções do processador depositem informações de status em um registro de uso geral quando o programa o solicitar. MIPS , AMD 29000 , DEC Alpha e RISC-V são exemplos de arquiteturas que fornecem instruções de comparação que armazenam o resultado da comparação em um registro de propósito geral, como um único bit ou um valor numérico de 0 ou 1. Os desvios condicionais agem com base em o valor no registro de uso geral.

Normalmente, as instruções de comparação testam a igualdade ou magnitude com / sem sinal. Para testar outras condições, um programa usa uma fórmula de equivalência. Por exemplo, MIPS não tem "carry bit", mas um programa que executa a adição de várias palavras pode testar se uma adição de uma única palavra de registros transbordou, testando se a soma é inferior a um operando:

        # alow = blow + clow
	addu	alow, blow, clow
        # set tmp = 1 if alow < clow, else 0
	sltu	tmp, alow, clow
	addu	ahigh, bhigh, chigh
	addu	ahigh, ahigh, tmp

A sltu instrução é tmp definida como 1 ou 0 com base na comparação especificada de seus outros dois operandos. (Aqui, o registro de propósito geral tmp não é usado como um registro de status para controlar um salto condicional; em vez disso, o valor possível de 1, indicando o transporte da adição de ordem inferior, é adicionado à palavra de ordem superior.)

Este esquema torna-se menos conveniente ao adicionar três ou mais palavras, pois há dois acréscimos durante o cálculo b + c + tmp , qualquer um dos quais pode gerar um transporte, que deve ser detectado com duas sltu instruções. Felizmente, esses dois carregamentos podem ser adicionados um ao outro sem risco de estouro, portanto, a situação se estabiliza em cinco instruções por palavra adicionada.

Veja também

Referências