|
ARM Advanced RISC Machine |
||
|
Estrutura de Procedures e Functions (De C para Assembler)
A chamada de funções
e procedures é dividida em 6 passos:
As funções de até 4
parâmetros tem como destino os registradores de R0-R3 , com o primeiro
parâmetro no r0. Os demais são colocados na pilha e são acessados
utilizando [SP+Displacement]. long b, //Primeiro parâmetro passado em R0
int *c, //Segundo parâmetro passado em R1
short d, //Quarto parâmetro passado em R2
float e) //Quinto parâmetro passado em R3
No caso acima, todos
os argumentos cabem nos registradores. long long f, //Primeiro parâmetro passado em R0/R1
int g, //Segundo parâmetro passado em R2
double h) //Terceiro parâmetro passado em R3 e Pilha
long i) //Quarto parâmetro passado somente na Pilha
Já aqui, os
primeiros dois são passados nos registradores, o terceiro é passado
parcialmente no registrador e o quarto é passado diretamente na pilha.
É chamada executando
o comando de Branch and Link (Expansão e linkagem). A primeira instrução em uma função normalmente é assim: stmdb sp!, {r4 - r6, lr}
Ela faz um Push LR, Push R6, Push R5, Push R4.
Esta instrução
preserva os valores dos registradores de R4 até R11, e o R13. É total
responsabilidade da função preservar esses. Em seguida, uma operação é realizada na pilha para reservar espaço para as variáveis locais. sub sp, sp, #0xC
5º Passo: Corpo
Então, o corpo da
função é executado, em algum momento o compilador decide que o registrador
R0 será responsável pelo retorno da função. Se o espaço foi alocado para variáveis locais, ele é então desalocado: add sp, sp, #0xC Os registradores salvos no começo são restaurados: ldmia sp!, {r4 ¡V r6, lr} pop(r4); pop(r5); pop(r6); pop(lr); E finalmente o endereço de retorno: Bx lr
|
||