Eecução 17-29 - Volns Bernal 1 17-29 - Volns Bernal 2 Agenda Volns Borges Bernal volns@lsi.u.br http://www.lsi.u.br/~volns Os problemas Controle do endereço de orno da função Controle do quadro da pilha de Laboratório de Sistemas Integráveis http://www.lsi.u.br/ 17-29 - Volns Bernal 3 17-29 - Volns Bernal 4 Os problemas Os problemas 1 - Retorno de subrotina (função) Quando uma subrotina (função) é ativada, o controle da deve ser transferido para a instrução inicial da subrotina. b() void b() Ao termino da subrotina, a próima instrução a ser eecutada deve ser a instrução posterior à instrução que ativou a subrotina 17-29 - Volns Bernal 5 17-29 - Volns Bernal 6 Os problemas 2 Variáveis locais As variáveis locais e parâmetros passados para a função devem eistir somente enquanto durar a função. Os problemas 3 Instâncias independentes Cada instância de uma subrotina deve possuir suas próprias instâncias de variáveis locais e parâmetros. b void b(int ) int i b b void b(int ) int i If ( ) b(k) void b(int ) int i If ( ) b(k) 17-29 Volns B. Bernal 1
Eecução 17-29 - Volns Bernal 7 17-29 - Volns Bernal 8 Finalidade Realizar o controle da de subrotinas de um programa: 1. Controle do endereço de orno da função; 2. Passagem dos valores dos argumento da função; 3. à função. Descrição Eaço de memória eecialmente reservado para organização de uma pilha de quadros (frame) de ativação (ou registro de ativação). Cada quadro (frame) correonde ao controle da ativação de uma função; Esta pilha de quadros é usada como memória auiliar durante a do programa 17-29 - Volns Bernal 9 17-29 - Volns Bernal 1 É reservado na memória virtual uma área eclusiva para a pilha de. Memória virtual Memória virtual b() função a() 17-29 - Volns Bernal 11 17-29 - Volns Bernal 12 Memória virtual Memória virtual b() void b() c() função b() função a() b() void b() c() void c() função c() função b() função a() 17-29 Volns B. Bernal 2
Eecução 17-29 - Volns Bernal 13 17-29 - Volns Bernal 14 Suporte pelo processador Instruções eeciais para subrotinas: CALL Chamada de subrotina: o Desvia o controle para uma subrotina salvando o endereço de orno (endereço da próima instrução) no topo da pilha. - Retorno de uma subrotina: o O controle do programa (PC) é transferido para o valor desempilhando do topo da pilha Controle do endereço de orno da função Registradores eeciais para controle da pilha de : SP (stack pointer): Contém o endereço do topo da pilha de 17-29 - Volns Bernal 15 17-29 - Volns Bernal 16 Controle do endereço de orno Realizado pelas instruções CALL e Controle do endereço de orno de funcionamento das instruções CALL e Programa em C void f1() Programa em assembler f2() void f2() 17-29 - Volns Bernal 17 17-29 - Volns Bernal 18 Controle do endereço de orno de funcionamento das instruções CALL e Controle do endereço de orno de funcionamento das instruções CALL e A instrução CALL salva o endereço de orno (endereço da instrução após CALL) na pilha de e transfere o controle para f2. A instrução ira o valor contido no topo da pilha de (endereço de orno) e transfere o controle para o endereço representado por este valor. 17-29 Volns B. Bernal 3
Eecução 17-29 - Volns Bernal 19 17-29 - Volns Bernal 2 Passagem dos valores dos argumento da função A pilha de é utilizada, também, para passagem dos argumentos da função. Os valores dos argumentos são inseridos na pilha de antes da ativação da instrução CALL. 17-29 - Volns Bernal 21 17-29 - Volns Bernal 22 void f2(int a, int b) int f1() f2(,); 17-29 - Volns Bernal 23 17-29 - Volns Bernal 24 17-29 Volns B. Bernal 4
Eecução 17-29 - Volns Bernal 25 17-29 - Volns Bernal 26 17-29 - Volns Bernal 27 17-29 - Volns Bernal 28 17-29 - Volns Bernal 29 17-29 - Volns Bernal 3 Variáreis locais também são alocadas na pilha de. As variáveis locais de uma função ficam alocadas no quadro da reectiva função na pilha de 17-29 Volns B. Bernal 5
Eecução 17-29 - Volns Bernal 31 17-29 - Volns Bernal 32 void f2(int a, int b) int ; int f1() f2(,); 17-29 - Volns Bernal 33 17-29 - Volns Bernal 34 4 btes 17-29 - Volns Bernal 17-29 - Volns Bernal 36 17-29 Volns B. Bernal 6
Eecução 17-29 - Volns Bernal 37 17-29 - Volns Bernal 38 Controle do quadro da pilha de de quadro da pilha Controle do quadro da pilha de void f2(int a, int b) int ; int ; Variáveis locais Endereço de orno Argurmentos da função f2 int f1() f2(,); da função f1 17-29 - Volns Bernal 39 17-29 - Volns Bernal 4 Controle do quadro da pilha de - Processador Intel Pentium Registradores eeciais: Registrador ESP: contém o endereço do topo da pilha Registrador EBP: contém a base do quadro Sentido do crescimento da pilha Por motivos históricos, a pilha geralmente cresce em direção aos endereços mais baios de memória. Assim, para alocar eaço para um endereço na pilha, devemos subtrair 4 de ESP no Pentium (um endereço no Intel Pentium ocupa 4 btes!). Para desalocar devemos somar 4 ao ESP. Eercício Seja a configuração da pilha em um processador Intel Pentium (little endian) mostrada no próimo slide. Suponha o valor do registrador ea = A1B2C3D4 (he) Qual é a configuração da pilha de após a da instrução a seguir? pushl %ea (empilha os 4 btes que representam o valor contido no registrador ea) 17-29 - Volns Bernal 41 17-29 - Volns Bernal 42 Eercício Memória Eercício Memória 4 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 A 4 B 4 C 4 D 4 E 4 F 4 1 e 4 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 A 4 B 4 C 4 D 4 E 4 F 4 1 D4 C3 B2 A1 e 17-29 Volns B. Bernal 7
Eecução Eercício 17-29 - Volns Bernal 43 Em relação ao slide anterior, qual é a configuração da pilha de após a da seguinte instrução: popl %ea (desempilha 4 btes do topo da pilha e armazena no registrador ea) Eercício Memória 4 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 A 4 B 4 C 4 D 4 E 4 F 4 1 17-29 - Volns Bernal 44 e 17-29 - Volns Bernal 45 17-29 - Volns Bernal 46 Controle do quadro da pilha de Arquitetura Intel Pentium Registrador O registrador é utilizado como referência para o quadro de ativação corrente O código gerado por um compilador na de uma chamada de função começa com: pushl % movl %e,% E termina com: movl %,%e popl % Controle do quadro da pilha de void troca (int *, int *) int tmp; tmp = *; * = *; * = tmp; mov %e, % sub $4, %e /* reserva eaço na pilha para tmp */ mov 8(%), %ea /* 1o parâmetro: endereço de */ mov (%ea), %ed /* pega valor de */ mov %ed, -4(%) /* tmp = * */ mov 12(%), %eb /* 2o parâmetro: endereço de */ mov (%eb), %ed /* pega valor de */ mov %ed, (%ea) /* * = * */ mov -4(%), %ed /* leitura do valor de tmp */ mov %ed, (%eb) /* * = tmp */ mov %, %e 17-29 - Volns Bernal 47 17-29 - Volns Bernal 48 Controle do quadro da pilha de Controle do quadro da pilha de mov %e, % sub $4, %e mov 8(%), %ea mov (%ea), %ed mov %ed,-4(%) mov 12(%), %eb mov (%eb), %ed mov %ed, (%ea) mov -4(%), %ed mov %ed, (%eb) mov %, %e e mov %e, % sub $4, %e mov 8(%), %ea mov (%ea), %ed mov %ed,-4(%) mov 12(%), %eb mov (%eb), %ed mov %ed, (%ea) mov -4(%), %ed mov %ed, (%eb) mov %, %e e 17-29 Volns B. Bernal 8
Eecução 17-29 - Volns Bernal 49 17-29 - Volns Bernal 5 Controle do quadro da pilha de Controle do quadro da pilha de mov %e, % sub $4, %e mov 8(%), %ea mov (%ea), %ed mov %ed,-4(%) mov 12(%), %eb mov (%eb), %ed mov %ed, (%ea) mov -4(%), %ed mov %ed, (%eb) mov %, %e e mov %e, % sub $4, %e mov 8(%), %ea mov (%ea), %ed mov %ed,-4(%) mov 12(%), %eb mov (%eb), %ed mov %ed, (%ea) mov -4(%), %ed mov %ed, (%eb) mov %, %e tmp e 17-29 - Volns Bernal 51 Controle do quadro da pilha de Eercício 17-29 - Volns Bernal 52 Qual é o valor numérico impresso na do programa a seguir? Endereços: -4(%) variável local tmp 8(%) parâmetro 12(%) parâmetro tmp - 4 btes 8 btes 12 btes int i; int mfunction() int i; i = i + 2; printf( %d\n,i); int main(int argc, char **argv) i = i + 3; mfuncion(); 17-29 Volns B. Bernal 9