A pilha/Stack é o local onde o processador pode salvar e recuperar dados auxiliando na execução de
algum trecho de código quando trabalhamos. A Stack pode ser utilizada para salvar registradores como
backup, armazenar argumentos para uma função e também alocação de espaço local.
Diferente de outras arquiteturas, ARM fornece configurações de pilha que podem ser Full Descending(FD),
Empty Descending(ED), Full Ascending(FA), Empty Ascending(EA). Essa definição fica à escolha do usuário.
Em FD, a pilha se movimenta a partir do topo, memória mais alta, para a base, memória mais baixa. O tipo
FA se movimenta da base para o topo.
As formas ED e EA são semelhantes às formas FD e FA, mas apontando para o próximo espaço vazio da pilha.
Tab. 1: Pilha ARM: FD
Pilha |
Empilhar |
Desempilhar |
$FFFFFFFF |
SP - 4
↓ |
SP + 4
↑ |
|
... |
|
... |
|
$00000000 |
Tab. 1: Pilha ARM: FA
Pilha |
Empilhar |
Desempilhar |
$00000000 |
SP + 4
↓ |
SP - 4
↑ |
|
... |
|
... |
|
$FFFFFFFF |
O acesso à pilha, assim como em outras arquiteturas, é feito por intermédio do registrador SP que é
decrementado/incrementado para armazenar/remover dados de acordo com o tipo de pilha.
Apenas valores 32-bits podem ser empilhados e desempilhados da pilha tendo a ordem de desempilhar dos
dados inversa à forma de empilhar. Qualquer manipulação errada da pilha acarretará em erros
graves em um programa.
Os valores não são removidos literalmente da pilha, o registrador SP é incrementado disponibilizando
assim espaço na pilha. Os dados antigos continuam no mesmo local até que sejam sobrescritos.
As instruções para movimentação de múltiplos valores, LDM e STM, são utilizadas para armazenar e remover
elementos da stack. A partir da versão v5+, instruções Push e Pop foram introduzidas.
Em instruções de pilha, exemplos de pilhas FD e FA serão vistos bem como seus sinônimos.