Suporte a funções e procedimentos no IA-32 (3)

Slides:



Advertisements
Apresentações semelhantes
SOFTWARE BÁSICO.
Advertisements

Assembly MAC-1 Implementação de ciclos Ciclo ‘while’ // Em Java : ...
Programação MAC-1 Exemplo: copiar vector
Aula 4 – Sumário Linguagem assembly do MAC-1 A pilha
Programação C++.
A arquitectura IA32 A arquitectura de um processador é caracterizada pelo conjunto de atributos que são visíveis ao programador. Tamanho da palavra Número.
Programação em Assembly Procedimentos e funções
Arquitecturas RISC Programação em assembly
Programação em assembly
Y86: Definição da Arquitectura
Y86: Encadeamento de Instruções (PIPE-)
Optimização do Desempenho: Técnicas Dependentes da Máquina
Linguagem de Montagem.
AJProença, Sistemas de Computação, UMinho, 2013/141 Análise do código de gestão de uma função –invocação e regresso instrução de salto, mas com salvaguarda.
Linguagem de Montagem PROVA 4 – 3/12.
Hugo Calazans André Ricardo
Interface entre as linguagens C e Assembly 8085
Ambiente de Execução - Rotinas
A Linguagem de Máquina – Funções e recursividade Prof. André Luis M. Silva orgearq wordpress.com.
Procedimentos Registro de Ativação e Variáveis Locais 11 1.
Hugo Calazans André Ricardo
1 Aula 6 – Sumário  Revisão da aula anterior  Endereçamento indirecto  Recursividade  Conceito  Exemplos.
Aula 4 – Sumário Linguagem assembly do MAC-1: Funções e procedimentos
Existem 8 registos principais de 32 bits no processador (existem mais como %EIP): %EAX %EBX %ECX %EDX %ESI %EDI %EBP %ESP Os registos são armazenados em.
ASSEMBLY – aula 2 Hugo Calazans
Fases da Gestão de Projetos
INE5408 Estruturas de Dados Passagem por Referência.
IFRN Técnico em Informática para Internet Desenvolvimento de Algoritmos Prof. Gilbert Azevedo.
SISTEMAS OPERACIONAIS MEMÓRIA VIRTUAL. INTRODUÇÃO Memória Virtual é um técnica sofisticada e poderosa de gerenciamento de memória, onde a MP e a MS são.
Alessandro D. R. Fazenda
Jean Carlo Mendes
Jean Carlo Mendes
“Armazenar dados e programas que serão utilizados pelo processador (CPU – Unidade Central de Processamento) ”
Revisão de Conceitos Thiago Medeiros Barros. Algoritmos Qualquer problema de computação pode ser resolvido executando uma série de ações em uma ordem.
PROGRAMAÇÃO BÁSICA NA HP-12C. A MÉMÓRIA BÁSICA DA HP-12C A MÉMORIA BÁSICA DA HP-12C GOLD/PLATINUM/PRESTIGE POSSUI 8 LINHAS A HP-12C GOLD/PLATINUM/PRESTIGE.
Aula 5 - Métodos. Desenvolvimento de Programas A melhor forma de construir programas grandes é dividi-los em programas menores que executam tarefas específicas.
CLASSES EM JAVA Dilvan Moreira (baseado no livro Big Java)
Lógica de Programação Aula 26 Prof. Auler Gomes.
Algoritmos e Estruturas de Dados I
UNIVERSIDADE FEDERAL DE GOIÁS INSTITUTO DE INFORMÁTICA
Programação em Assembly
CÓDIGO DO TRABALHO - TÍTULO DO TRABALHO
Programação em C Aula 8.
Microprogramação.
PSI3441 – Arquitetura de Sistemas Embarcados
Fundamentos de Programação 1
Exercício completo de especificação de sistemas
Linguagem C Para programadores Python
INSTRUÇÃO DA CAUSA A fase instrutória do procedimento ordinário inicia quando termina a audiência preliminar,' consiste na realização de provas e oferecimento.
Arquitetura de Organização de Computadores
Como Calcular Médias no ASP
SISTEMAS OPERACIONAIS
UNIDADE 7 Tipos estruturados
INE 5201 – INTRODUÇÃO À CIÊNCIA DA COMPUTAÇÃO
Diagramas de Sequência
Algoritmos e Programação MC102
Funções do Usuário em Matlab
Estrutura de Repetição
Sistemas Operacionais
Suporte a funções e procedimentos no IA-32 (3)
Suporte a funções e procedimentos no IA-32 (3)
Prof. Rafael Mesquita Pilha Prof. Rafael Mesquita
Laboratório I Mateus Raeder.
Linguagem C Linguagem Imperativa
Programação em assembly
RISC vs. CISC Introdução
Linguagem C Linguagem Imperativa
Compiladores – Introdução
Ambiente de execução.
Transcrição da apresentação:

Suporte a funções e procedimentos no IA-32 (3) Análise do código de gestão de uma função invocação e regresso instrução de salto, mas com salvaguarda do end. regresso em registo (RISC; aninhamento / recursividade ? ) em memória/stack (IA-32; aninhamento / recursividade ? ) instrução de salto para o endereço de regresso salvaguarda & recuperação de registos (na stack) função chamadora ? (nenhum/ alguns/ todos ? RISC/IA-32 ? ) função chamada? (nenhum/ alguns/ todos ? RISC/IA-32 ? ) gestão do contexto (na stack, em activation record ou frame) atualização/recuperação do frame pointer (IA-32... ) reserva/libertação de espaço para variáveis locais

Análise das fases em swap, no IA-32 (fig. já apresentada) void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } swap: pushl %ebp movl %esp,%ebp pushl %ebx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx),%eax movl (%edx),%ebx movl %eax,(%edx) movl %ebx,(%ecx) movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret Arranque Corpo Término

Análise dos contextos em swap, no IA-32 em call_swap void call_swap() { int zip1 = 15213; int zip2 = 91125; (…) swap(&zip1, &zip2); } void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } na invocação de swap na execução de swap no regresso a call_swap Que contextos (IA-32)? passagem de parâmetros via stack espaço para variáveis locais na stack info de suporte à gestão (stack) endereço de regresso apontador para a stack frame salvaguarda de registos

Construção do contexto na stack, no IA-32 %esp call_swap swap variáveis locais de swap endereço crescente 1. Antes de invocar swap 2. Preparação p/ invocar swap salvaguardar registos? passagem de parâmetros salv. registos ? %ebp frame pointer %esp antigo %ebp 3. Invocar swap e guardar endereço de regresso %esp ender. regresso 1. Início de swap atualizar frame pointer salvaguardar registos ? reservar espaço p/ locais %esp parâmetros p/ swap 2. Corpo de swap salv. registos ? 3. Término de swap ... libertar espaço de var locais recuperar registos ? recuperar antigo frame pointer regressar a call_swap %esp variáveis locais de call_swap stack %ebp frame pointer 4. Terminar invocação de swap... libertar espaço com parâmetros na stack recuperar registos? antigo %ebp

Evolução da stack, no IA-32 (1) call_swap 1. Antes de invocar swap endereço crescente void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } void call_swap() { int zip1 = 15213; int zip2 = 91125; (…) swap(&zip1, &zip2); } %esp zip2 stack %ebp-4 zip1 %ebp frame pointer antigo %ebp

Evolução da stack, no IA-32 (2) call_swap 2. Preparação p/ invocar swap salvaguardar registos?...não... passagem de parâmetros endereço crescente void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } void call_swap() { int zip1 = 15213; int zip2 = 91125; (…) swap(&zip1, &zip2); } %esp &zip1 %ebp-12 &zip2 zip2 stack zip1 %ebp frame pointer antigo %ebp

Evolução da stack, no IA-32 (3) call_swap endereço crescente 2. Preparação p/ invocar swap salvaguardar registos?...não... passagem de parâmetros leal -8(%ebp),%eax Calcula &zip2 pushl %eax Empilha &zip2 leal -4(%ebp),%eax Calcula &zip1 pushl %eax Empilha &zip1 %esp &zip1 %ebp-12 &zip2 zip2 stack zip1 %ebp frame pointer antigo %ebp

Evolução da stack, no IA-32 (4) call_swap 3. Invocar swap e guardar endereço de regresso endereço crescente void call_swap() { int zip1 = 15213; int zip2 = 91125; (…) swap(&zip1, &zip2); } %esp antigo %eip &zip1 %ebp-12 &zip2 zip2 stack call swap Invoca função swap zip1 %ebp frame pointer antigo %ebp

Evolução da stack, no IA-32 (5) 1. Início de swap atualizar frame pointer salvaguardar registos reservar espaço p/ locais...não... swap endereço crescente %esp antigo %ebx void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } %esp %ebp frame pointer antigo %ebp antigo %eip *xp *yp swap: pushl %ebp Salvaguarda antigo %ebp movl %esp,%ebp Faz %ebp frame pointer pushl %ebx Salvaguarda %ebx zip2 stack zip1 antigo %ebp %ebp antigo %ebp

Evolução da stack, no IA-32 (6) swap %esp 2. Corpo de swap antigo %ebx %ebp endereço crescente frame pointer antigo %ebp void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } antigo %eip %ebp+8 *xp %ebp+12 *yp zip2 movl 12(%ebp),%ecx Carrega arg yp em ecx movl 8(%ebp),%edx Carrega arg xp em edx movl (%ecx),%eax Coloca y em t1(eax) movl (%edx),%ebx Coloca x em t0 (ebx) movl %eax,(%edx) Armazena y em *xp movl %ebx,(%ecx) Armazena x em *yp zip1 stack antigo %ebp

Evolução da stack, no IA-32 (7) swap 3. Término de swap ... libertar espaço de var locais...não... recuperar registos recuperar antigo frame pointer regressar a call_swap %esp antigo %ebx antigo %ebx endereço crescente antigo %ebp antigo %ebp antigo %eip antigo %eip void swap(int *xp, int *yp) { (…) } *xp *yp zip2 popl %ebx Recupera %ebx movl %ebp,%esp Recupera %esp popl %ebp Recupera %ebp ou leave Recupera %esp, %ebp ret Regressa à f. chamadora zip1 stack %ebp antigo %ebp frame pointer

Evolução da stack, no IA-32 (8) call_swap 4. Terminar invocação de swap... libertar espaço de parâmetros na stack... recuperar registos?...não... endereço crescente void call_swap() { int zip1 = 15213; int zip2 = 91125; (…) swap(&zip1, &zip2); } &zip1 *yp *xp &zip2 %esp zip2 stack addl $8,%esp Atualiza stack pointer zip1 %ebp frame pointer antigo %ebp