A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

O Stack e Subrotinas Permitem reusar o código Escreva e depure o código uma vez, use-o quantas vezes for preciso Uma Subrotina deve ser chamada Uma Subrotina.

Apresentações semelhantes


Apresentação em tema: "O Stack e Subrotinas Permitem reusar o código Escreva e depure o código uma vez, use-o quantas vezes for preciso Uma Subrotina deve ser chamada Uma Subrotina."— Transcrição da apresentação:

1 O Stack e Subrotinas Permitem reusar o código Escreva e depure o código uma vez, use-o quantas vezes for preciso Uma Subrotina deve ser chamada Uma Subrotina sempre retorna algo ao seu término Pode ter sua codificação feita no futuro Ajuda a manter a legibilidade e manutenção do código Pode-se aninhar Subrotinas Se for um procedimento, não retorna um valor Se for uma função, então retorna um valor

2 Como Subrotinas são implementadas no ARM Salto para a Subrotina (Branch and Link) BL label : LR ← PC + 4 : PC ← PC + IR(offset) Link Register: LR (R14) Armazena o endereço da instrução após o BL Retorno da Subrotina MOV PC, LR : PC ← LR

3 Exemplo de Subrotina @ Mostra o valor de R5 no display mov r0, r5 ; R0 contém o valor e... mov r1, #1 ; R1 o ponto decimal BL Display8Segment ; Mostra valor no display... Display8Segment: stmfd sp!,{r0-r2,lr}; Salva registradores no Stack ldr r2,=Digits; Carrega R0 com a combinação ldr r0,[r2,r0,lsl#2]; de segmentos adequada tst r1,#0x01 ; Se r1=1, orrne r0,r0,#SEG_P ; então mostra ponto swi SWI_SETSEG8 ; Exibe valor no display ldmfd sp!,{r0-r2,pc}; Restaura registradores do Stack

4 O Stack O stack é usado para “lembrar” valores Provê uma área de armazenamento temporário Permite a implementação de Subrotinas do tipo função R13 aponta para o topo do stack (Top Of Stack -TOS) R13 também é conhecido como Stack Pointer (SP) Um Stack obedece a regra LIFO (last-in-first-out) Último valor empilhado é o primeiro a ser desempilhado O stack cresce “para baixo” na memória Cada modo do proc. tem o seu stack pointer: R13_fiq, R13_svc, R13_abt, R13_undef,... R13 or SP se referem ao modo corrente

5 Operação do Stack

6

7

8

9

10

11

12

13

14

15

16

17 Stack como área temporária Push: Salva registrador no stack STR Rs, [SP], #-4 : MBR ← Rs : MAR ← SP : M(MAR) ← MBR : SP ← SP - 4 Pop: Recupera registrador do stack LDR Rd, [SP, #4]! : SP ← SP + 4 : MAR ← SP : MBR ← M(MAR) : Rd ← MBR

18 Push/Pop de múltiplos registradores Push: Salva um conjunto de registradores no Stack STM SP!, { } Pop: Recupera um conjunto de registradores LDM SP!, { } pode ser: – IB: Increment Before – IA: Increment After – DB: Decrement Before – DA: Decrement After : Lista de registradores a serem armazenados Ex:, R0-R7, R10

19 Push/Pop de múltiplos registradores Para facilitar o uso, o das instruções STM e LDM possuem apelidos que refletem o uso do stack: FD = Full Descending : STMFD/LDMFD = STMDB/LDMIA ED = Empty Descending : STMED/LDMED = STMDA/LDMIB FA = Full Ascending : STMFA/LDMFA = STMIB/LDMDA EA = Empty Ascending : STMEA/LDMEA = STMIA/LDMDB Qualquer stack que não seja o FD é raro!

20 Exemplo de Full Descending (FD)

21 Exercícios 1. Criar uma Subrotina que retorne em R0 o número de caracteres (tamanho) de uma string. A string deverá ser terminada com o caracter 0x00. R0 deverá apontar para o início da string. R0 também deverá retornar o número de caracteres da string, excluindo o caracter de terminação. @ Calcula o tamanho de string1 LDR R0, =String1 BL TamString CMP R0, #0 BEQStringVazia

22 Exercícios 2. Criar uma Subrotina para copiar parte de uma string (string1) em uma outra string (string2). Ambas as strings deverão ser terminadas com o caracter 0x00. R0 deverá apontar para o início de string1, R1 para o início de string2, R2 deverá conter a posição do primeiro caracter a ser copiado e R3 deverá conter o número (máximo) de caracteres a ser copiado. @ Copiar 8 caracteres de string1 em string2 começando @ pelo segundo caracter LDR R0, =String1 LDR R1,= String2 MOV R2,#2 MOV R3, #8 BL CopiaSubstring

23 Exercícios 3. Criar uma Subrotina que procure a primeira ocorrência de uma string (string1) dentro de outra string (string2). As strings deverão ser terminadas com o caracter 0x00. R0 deverá apontar para o início de string1 e R1 para o início de string2. R0 deverá retornar a posição em que string1 foi encontrada em string2 ou 0 caso não seja encontrada. @ Procurar string1 em string2 LDR R0, =String1 LDR R1,= String2 BL ProcuraSubstring CMP R0, #0 BEQNaoEncontrado


Carregar ppt "O Stack e Subrotinas Permitem reusar o código Escreva e depure o código uma vez, use-o quantas vezes for preciso Uma Subrotina deve ser chamada Uma Subrotina."

Apresentações semelhantes


Anúncios Google