Assim como várias outras arquiteturas, a ARM também possui suas flags que mostram o status atual do
processador. A tabela abaixo mostra os bits do registrador CPSR, da esquerda para direita, divididos
em: flags de condição, flags de controle e bits de modos de operação do processador.
Os bits 8 a 27 são reservados para as futuras atualizações da arquitetura e não são acessíveis.
Tab. 7: CPSR
Bit 31 |
Bit 30 |
Bit 29 |
Bit 28 |
|
|
|
|
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
N |
Z |
C |
V |
- |
- |
- |
- |
I |
F |
T |
M4 |
M3 |
M2 |
M1 |
M0 |
As flags de condição da armv4 são utilizadas para a tomada de decisões quando uma instrução de
branch condicional é utilizada, por exemplo.
Ex:
B ;Branch Always
BEQ ;Branch if Equal
A alteração dessas flags é feita de forma explícita adicionando o sufixo S nas instruções que
permitem o seu uso. Algumas instruções atualizam as flags sem necessidade de sufixo.
Ex:
ADDS R0,R0,#1 ;R0 <- R0 + 1
Negative - N
A flag N é indica se um valor contido em um registrador é negativo ou positivo. Caso o bit mais
significativo seja 1, a flag N tem seu valor atualizado para 1. Caso contrário, N é atualizada o valor 0.
Zero - Z
A flag Z informa que um valor contido em um registrado é zero ou não. Se zero, o valor de Z é atualizado
para 1. Caso contrário, Z é atualizado para 0.
Overflow - V
Com a flag V, podemos descobrir se ocorreu um overflow em alguma instrução aritmética de soma ou subtração,
por exemplo. Quando ocorre um overflow, V é atualizada para 1. Caso o overflow não ocorra seu valor é atualizado para 0.
Carry - C
O “vai-um” e “vem-um” nas operações de soma e subtração, por exemplo, são representados pela flag Carry.
Quando ocorre um “vai-um”, C é atualizada para 1, e para 0 quando não ocorre.
Na subtração, a flag C tem o comportamento contrário. Essa flag também é utilizada pelas instruções de
deslocamento, rotação e multiplicação.
As flags de controle são compostas pelas flag I, F e T que correspondem as flags que habilitam/desabilitam
as interrupções IRQ(Interrupt Request) e FIRQ(Fast Interrupt Request), e o tipo de instrução como ARM(32-Bits) ou Thumb(16-Bits).
Para as flags I e F, quando seus valores são atualizados para 1, as suas interrupções correspondentes
são desabilitadas e não reconhecidas. Caso sejam 0, suas interrupções são habilitadas e executadas.
Em relação a flag T, disponível em armv4T, quando atualizadas para 1, as instruções no formato ARM são
executadas. Caso seja 0, instruções no formato Thumb são executadas. Nas versões v1, v2, v3, e outras versões que não possuem a extensão T, essa flag deve sempre ser definida para 0.
Os bits de modo são responsáveis por configurar o modo de execução do processador como mencionado em Registradores. Quando uma interrupção é gerada, os bits M[4:0] do CSPR são setados de acordo com a tabela abaixo. Os registradores de uso dos modos também são mostrados.
Tab. 8: Bits de Modo e Registradores
M[4:0] |
Modo |
Registradores |
10000 |
User |
PC, R14 a R0, CPSR |
10001 |
FIQ |
PC, R14_fiq to R8_fiq, R7 a R0, CPSR, SPSR_fiq |
10010 |
IRQ |
PC, R14_irq, R13_irq,R12 a R0, CPSR, SPSR_irq |
10011 |
SVC |
PC, R14_svc, R13_svc,R12 a R0, CPSR, SPSR_svc |
10100 |
Reservado |
|
10101 |
Reservado |
|
10110 |
Reservado |
|
10111 |
Uso geral |
PC, R14_abt, R13_abt,R12 a R0, CPSR, SPSR_abt |
11000 |
Reservado |
|
11001 |
Reservado |
|
11010 |
Reservado |
|
11011 |
Uso geral |
PC, R14_und, R13_und,R12 a R0, CPSR, SPSR_und |
11100 |
Reservado |
|
11101 |
Reservado |
|
11110 |
Reservado |
|
11111 |
System |
PC, R14 a R0, CPSR ( V4+ apenas) |
Os modos acima são “acionados” quando uma interrupção/exceção de hardware ou software ocorre. O assunto
interrupções será visto um pouco mais adiante.
Os modos reservados são de uso em futuras atualização da arquitetura e não devem ser utilizados na v4.