View
215
Download
0
Embed Size (px)
MICROPROCESSADORES II (EMA911915)
SUB-ROTINAS E PILHA 2O SEMESTRE / 2018
MATERIAL DIDTICO
Harris & Harris 6.4.6 Procedure Calls
Patterson & Hennessy (4a edio) 2.8 Supporting Procedures in Computer Hardware
Usem as referncias acima somente para entender os conceitos. As instrues para procedimentos e formato da pilha que usaremos difere dos apresentados acima
Melhor referncia: Nios II Processor Reference Handbook, captulo 7
Microprocessadores II - Sub-rotinas e pilha
SUB-ROTINAS
Sub-rotinas so essenciais para o desenvolvimento de software modularizado e estruturado
Programao procedural
Sub-rotinas permitem aos programadores se concentrarem em apenas uma parte da tarefa por vez
Parmetros funcionam como uma interface entre uma sub-rotina e o resto do programa
Dados podem ser passados para a sub-rotina e retornados por essa
Microprocessadores II - Sub-rotinas e pilha
EXECUO DE SUB-ROTINAS
Na execuo de uma sub-rotina, o programa deve seguir 6 passos bsicos
1. Colocar os parmetros em algum lugar onde a sub-rotina possa acess-los
2. Transferir controle para a sub-rotina 3. Reservar recursos (memria) necessrios sub-rotina 4. Realizar o trabalho necessrio 5. Colocar o resultado em algum lugar acessvel a quem chamou a sub-
rotina 6. Retornar controle ao ponto de origem (quem chamou)
Microprocessadores II - Sub-rotinas e pilha
EXECUO DE SUB-ROTINAS
Na execuo de uma sub-rotina, o programa deve seguir 6 passos bsicos
1. Colocar os parmetros em algum lugar onde a sub-rotina possa acess-los
2. Transferir controle para a sub-rotina 3. Reservar recursos (memria) necessrios sub-rotina 4. Realizar o trabalho necessrio 5. Colocar o resultado em algum lugar acessvel a quem chamou a sub-
rotina 6. Retornar controle ao ponto de origem (quem chamou)
Memria (pilha) ou registradores?
Microprocessadores II - Sub-rotinas e pilha
EXECUO DE SUB-ROTINAS
Na execuo de uma sub-rotina, o programa deve seguir 6 passos bsicos
1. Colocar os parmetros em algum lugar onde a sub-rotina possa acess-los
2. Transferir controle para a sub-rotina 3. Reservar recursos (memria) necessrios sub-rotina 4. Realizar o trabalho necessrio 5. Colocar o resultado em algum lugar acessvel a quem chamou a sub-
rotina 6. Retornar controle ao ponto de origem (quem chamou)
Instruo do processador
Microprocessadores II - Sub-rotinas e pilha
EXECUO DE SUB-ROTINAS
Na execuo de uma sub-rotina, o programa deve seguir 6 passos bsicos
1. Colocar os parmetros em algum lugar onde a sub-rotina possa acess-los
2. Transferir controle para a sub-rotina 3. Reservar recursos (memria) necessrios sub-rotina 4. Realizar o trabalho necessrio 5. Colocar o resultado em algum lugar acessvel a quem chamou a sub-
rotina 6. Retornar controle ao ponto de origem (quem chamou)
Configurar stack frame
Microprocessadores II - Sub-rotinas e pilha
EXECUO DE SUB-ROTINAS
Na execuo de uma sub-rotina, o programa deve seguir 6 passos bsicos
1. Colocar os parmetros em algum lugar onde a sub-rotina possa acess-los
2. Transferir controle para a sub-rotina 3. Reservar recursos (memria) necessrios sub-rotina 4. Realizar o trabalho necessrio 5. Colocar o resultado em algum lugar acessvel a quem chamou a sub-
rotina 6. Retornar controle ao ponto de origem (quem chamou)
Microprocessadores II - Sub-rotinas e pilha
EXECUO DE SUB-ROTINAS
Na execuo de uma sub-rotina, o programa deve seguir 6 passos bsicos
1. Colocar os parmetros em algum lugar onde a sub-rotina possa acess-los
2. Transferir controle para a sub-rotina 3. Reservar recursos (memria) necessrios sub-rotina 4. Realizar o trabalho necessrio 5. Colocar o resultado em algum lugar acessvel a quem chamou a sub-
rotina 6. Retornar controle ao ponto de origem (quem chamou)
Novamente... pilha ou
registradores ?
Microprocessadores II - Sub-rotinas e pilha
EXECUO DE SUB-ROTINAS
Na execuo de uma sub-rotina, o programa deve seguir 6 passos bsicos
1. Colocar os parmetros em algum lugar onde a sub-rotina possa acess-los
2. Transferir controle para a sub-rotina 3. Reservar recursos (memria) necessrios sub-rotina 4. Realizar o trabalho necessrio 5. Colocar o resultado em algum lugar acessvel a quem chamou a sub-
rotina 6. Retornar controle ao ponto de origem (quem chamou)
Instruo do processador
Microprocessadores II - Sub-rotinas e pilha
STACK FRAME
Tambm chamado de registro de ativao (activation record)
rea de memria (pilha) que armazena o estado da sub-rotina, e contm geramente as seguintes informaes
Os argumentos passados para a sub-rotina O endereo de retorno para quem chamou (caller) Espao para as variveis locais sub-rotina
Microprocessadores II - Sub-rotinas e pilha
ALGUMAS PERGUNTAS
Passar os parmetros atravs da pilha ou registradores? Se registradores, quais ?
Qual o formato (contedo) do stack frame ?
Quais registradores devem ser salvos pela sub-rotina chamada (callee) e quais pelo programa que a chamou (caller) ?
Como retornar o(s) resultado(s) ? Se registradores, quais ?
Microprocessadores II - Sub-rotinas e pilha
APPLICATION BINARY INTERFACE (ABI)
As respostas para as perguntas anteriores so respondidas pela ABI
ABI uma conveno que determina a interface entre o processador e o sistema (sistema operacional + compilador)
Quais os tamanhos para os tipos de dados bsicos Quais registradores precisam ser salvos pela sub-rotina chamada Qual o layout do stack frame
Microprocessadores II - Sub-rotinas e pilha
ABI ALTERA NIOS II
Presente no captulo 7 da referncia Nios II Processor Reference Handbook
Disponvel no site da disciplina
Nos nossos programas em linguagem de montagem vamos seguir essa ABI
Essencial quando estivermos mesclando cdigo assembly e C
Microprocessadores II - Sub-rotinas e pilha
USO DE REGISTRADORES
A ABI define o seguinte uso
Registrador Nome Uso regular
r0 zero 0x00000000
r1 at Temporrio usado pelo montador
r2 Valor de retorno (32 bits menos significativos)
r3 Valor de retorno (32 bits mais significativos)
r4 ... r7 Registradores de argumento (primeiro ao quarto, respectivamente)
r8 ... r15 Registradores de propsito geral, salvos pelo caller
r16 ... r23 Registradores de propsito geral, salvos pelo callee
r27 sp Stack pointer
r28 fp Frame pointer
r31 ra Endereo de retorno
Os registradores omitidos sero vistos mais adiante na disciplina procurar no us-los no momento
Microprocessadores II - Sub-rotinas e pilha
PILHA (1)
A pilha a estrutura utilizada para comunicao entre o caller e o callee, e para variveis automticas (locais)
Lembre-se: pilha > last-in, first-out
Quando mais de quatro argumentos devem ser passados para uma sub-rotina, precisamos usar a pilha
A ABI s fornece 4 registradores
Um registrador especial, stack pointer (sp), aponta para o ltimo elemento inserido na pilha
Microprocessadores II - Sub-rotinas e pilha
PILHA (2)
A pilha cresce para baixo, ou seja, de endereos maiores para menores
Para facilitar a manipulao do stack frame, um outro registrador, chamado de frame pointer (ou base pointer), usado
O frame pointer sempre aponta para o antigo frame pointer salvo na pilha (geralmente no topo da stack frame)
Microprocessadores II - Sub-rotinas e pilha
STACK FRAME NIOS II
argumentos de sada da pilha
endereos altos
endereos baixos
stack pointer (sp) argumentos de entrada da pilha
endereo de retorno
antigo frame pointer
registradores salvos
espao para variveis
temporrias
espao para argumentos de
sada para outra chamada stack pointer (sp)
frame pointer (fp)
Alocado e liberado pelo caller
Alocado e liberado pelo callee (sub-rotina corrente)
pilha antes da chamada forma geral da pilha aps stack frame ter sido inicializado
Microprocessadores II - Sub-rotinas e pilha
CHAMADA E RETORNO
A instruo do Nios II usada para saltar para sub-rotina a call
A instruo call automaticamente j salva PC+4 (endereo de retorno) no registrador r31 (ra)
Para retornar de uma sub-rotina, usamos a instruo ret
call minha_rotina
Salta para sub-rotina chamada minha_rotina
ret
Microprocessadores II - Sub-rotinas e pilha
PRLOGO E EPLOGO
Prlogo Trecho de cdigo inicial em uma sub-rotina, responsvel por configurar a
stack frame No Nios II, o prlogo deve:
Ajustar o stack pointer (alocar espao para o frame) Armazenar registradores no frame Setar o frame pointer para a posio do frame pointer anterior salvo na
pilha
Eplogo Trecho de cdigo no final da sub-rotina responsvel por restaurar os
registradores e o estado da pilha
Microprocessadores II - Sub-rotinas e pilha
EXEMPLO PRLOGO
stack pointer (sp) Estado atual da pilha antes da chamada
Microprocessadores II - Sub-rotinas e pilha
EXEMPLO PRLOGO
stack pointer (sp) Aps chamada ...
/* Adjust the stack pointer */ addi sp, sp, -16 /*