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. 10: 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 atualizam as flags. 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 inverso. Essa flag também é utilizada pelas instruções de
deslocamento, rotação e multiplicação.
As flags de controle são compostas pelas flags 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 e 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. 11: 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.