Arquitetura ARM Subrotinas Subrotinas Implementar uma sub-rotina requer dois passos: 1. 2. Armazenar o endereço de retorno. Desviar a execução para o endereço da sub-rotina. Quem executa esses dois passos: instrução BL label • Armazena endereço de retorno em LR (R14). • A execução é desviada para a posição de memória identificada por “label”. O retorno da sub-rotina se dá pela instrução BX LR, a qual carrega no registrador PC o conteúdo de LR. Problema! Onde? Subrotinas ENDEREÇO DE RETORNO DA SUBROTINA! 11 MOV R1,R2 20 SUB1: ... 40 SUB2: ... 12 BL SUB1 21 BL SUB2 41 ... 13 ... 22 ... 42 BX LR 23 BX LR 43 14 Como solucionar? R14(LR) 13 22 Por exemplo, uso da Pilha! Subrotinas Por Registradores Não altera o conteúdo da memória Por valor Passagem de Parâmetros Como os dados são enviados para a subrotina? Por Referência Por Pilha Altera o conteúdo da memória Subrotinas Para que a passagem de parâmetros efetivamente ocorra, é possível recorrer a pseudo-instruções. Pseudoinstruções São instruções simbólicas, não executáveis, que auxiliam o montador a determinar o conteúdo da memória ao instalar o programa Assembly. x: .word 5000 LDR R2, =x LDR R1,[R2] Cria uma palavra na memória cujo conteúdo é 5000 Armazena o endereço palavra “x” em R2 da Armazena o valor de x em R1 Subrotinas Passagem de Parâmetros Por Referência Por valor - É passado o endereço de memória que contém o dado. - É passado o dado da memória. x: .word 5000 LDR R2, =x x: .word 5000 LDR R2, =x LDR R3, [R2] Subrotinas Passagem de Parâmetros Por Registrador Exemplo: Subrotina que faz uma soma x: .word 5000 y: .word 0 LDR R0, =x LDR R1, =y LDR R0, [R0] BL SOMA STR R0, [R1] SOMA: ADD R0, R0, #1 BX LR Subrotinas Passagem de Parâmetros Por Pilha Dados são passados do programa para sub-rotina e vice-versa através da pilha Mas como é a pilha no ARM? Desafio