A armv4 define um total de 16 registradores de 32-Bits. Sendo os últimos de uso específico e os restantes de uso geral. Abaixo, uma tabela que demonstra os registradores mencionados, bem como seus usos.

Tab. 1: Registradores ARM
Registrador Uso
R0 Uso geral
R1 Uso geral
R2 Uso geral
R3 Uso geral
R4 Uso geral
R5 Uso geral
R6 Uso geral
R7 Uso geral
R8 Uso geral
R9 Uso geral
R10 Uso geral
R11 Uso geral
R12 Uso geral/Específico
R13 Stack Pointer - SP
R14 Link Register - LR
R15 Program Counter - PC

O bit mais significativo(BMS) dos registradores está na posição 31 e o menos significativo(BmS) na posição 0:

Tab. 2: Bits mais e menos significativos
R(0-15)/32-Bits
31(BMS) 30 29 ... 2 1 0(BmS)

Os registradores de uso geral, R0 a R12 podem ser utilizados em todas as instruções e modos de endereçamento definidos na armv4, sem exceções.

Tab. 3: Registradores de uso geral
Registrador Uso
R0 Uso geral
R1 Uso geral
R2 Uso geral
...
R10 Uso geral
R11 Uso geral
R12 Uso geral/Específico

O uso desses registradores como parâmetros/argumentos e/ou retorno de funções, fica a cargo do programador/usuário ou compiladores e assemblers. De acordo com o uso, devem ser salvos na pilha e posteriormente restaurados de acordo com a necessidade da aplicação.

Por padrão, os registradores R13, R14 e R15 possuem uso específico como pode ser visto na tabela XXX de registradores abaixo, bem como seus apelidos ou nomes.

Tab. 4: Registradores Específicos
Registrador Uso
R12 Uso geral/Específico
R13 Stack Pointer - SP
R14 Link Register - LR
R15 Program Counter - PC

O registrador R13(SP) armazena o ponteiro para o topo ou base da pilha e pode ser utilizado em conjunto com as instruções que armazenam múltiplos dados na pilha. Esse registrador é incrementado/decrementado de acordo com o tipo de pilha ou incremento.

Tab. 5: Exemplo de Pilha
Pilha Empilhar Desempilhar
$FFFFFF SP
SP
...
...
$000000

O R14(LK), por sua vez, armazena o endereço de retorno quando uma função, rotina ou subrotina é chamada. A atribuição desse endereço é feita de forma automática e o retorno é feito manualmente atribuindo R14 ao PC quando instruções específicas são utilizadas ou quando ocorre uma interrupção ou exceção. Ver Interrupções.

Ex:

MOVS PC, R14

Caso as chamadas às funções sejam feitas em cascata, o conteúdo do registrador R14 deve ser armazenado na pilha.

O R15, semelhante a outras arquiteturas, armazena o endereço, ou ponteiro, da instrução corrente. É incrementado após a execução de cada instrução, podendo ter seu conteúdo alterado quando instruções de fluxo de controle como Branch, Interrupções e Exceções são executadas.

Uma convenção, como exemplo, para uso dos registradores de uso geral e específico, R0 a R15, como mostrado abaixo. Porém, a definição fica em aberto de acordo, por exemplo, de um compilador.

Tab. 6: Exemplo de Convenção
Registrador Uso
R0-R3 Argumentos
R0-R1 Retorno
R4-R11 Uso geral
R12-15 Reservado/Especiais

Caso os registradores utilizados como argumentos não sejam suficientes, a pilha deve ser utilizada para armazenar os dados restantes.

A armv4 define que o processador que implemente sua arquitetura deve possuir diferentes modos de operação de acordo com a tabela abaixo.

Tab. 6: Exemplo de Convenção
M[4:0] Modo
10000 User
10001 Fast Interrupt
10010 Interrupt Request
Supervisor Abort
100111 Undefined
100111 System

Os bits M[4:0] na tabela acima estão contidos no registrador de status CPSR. Esse será visto mais adiante.

Tab. 7: CPSR
Bit 31 Bit 30 Bit 29 Bit 28 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - - - - - - - - - - M4 M3 M2 M1 M0

Os modos têm seus grupos de registradores específicos aos quais podem ser utilizados e que podem ser conferidos na tabela abaixo. Esses modos são setados quando ocorrem exceções, exceto modo usuário que é usado como padrão.

Tab. 8: Registradores e Modos
Modos de Operação
User Supervisor Abort Undefined Interrupt Fast Interrupt
R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6
R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8_FIQ
R9 R9 R9 R9 R9 R9_FIQ
R10 R10 R10 R10 R10 R10_FIQ
R11 R11 R11 R11 R11 R11_FIQ
R12 R12 R12 R12 R12 R12_FIQ
R13 R13_SVC R13_ABORT R13_UNDEF R13_IRQ R13_FIQ
R14 R14_SVC R14_ABORT R14_UNDEF R14_IRQ R14_FIQ
PC PC PC PC PC PC
- - - - - -
CPSR CPSR CPSR CPSR CPSR CPSR
SPSR_SVC SPSR_ABORT SPSR_UNDEF SPSR_IRQ SPSR_FIQ

Como pode ser observado, os registradores R0 a R7 estão presentes em todos modos, os registradores R8 a R12 podem ser utilizados têm seus usos específicos no modo FIQ e R13 a R15 tem seus usos específicos em todos os modos.

Desses modos apresentados acima, apenas o modo usuário(User) será utilizado ou mencionado ao longo do tutorial, exceto quando assuntos relacionados a interrupção estiverem em discussão.

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.

  1. 24/01/2025 - versão inicial