Suporte a funes e procedimentos no IA32 3

  • Slides: 12
Download presentation
Suporte a funções e procedimentos no IA-32 (3) Análise do código de gestão de

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 ? ) – invocação e regresso • 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 (em stack) • actualização/recuperação do frame pointer (IA-32. . . ) • reserva/libertação de espaço para variáveis locais AJProença, Sistemas de Computação, UMinho, 2010/11 1

Análise das fases em swap, no IA-32 (fig. já apresentada) void swap(int *xp, int

Análise das fases em swap, no IA-32 (fig. já apresentada) void swap(int *xp, int *yp) { int t 0 = *xp; int t 1 = *yp; *xp = t 1; *yp = t 0; } swap: pushl %ebp movl %esp, %ebp pushl %ebx movl movl 12(%ebp), %ecx 8(%ebp), %edx (%ecx), %eax (%edx), %ebx %eax, (%edx) %ebx, (%ecx) movl -4(%ebp), %ebx movl %ebp, %esp popl %ebp ret AJProença, Sistemas de Computação, UMinho, 2010/11 Arranque Corpo Término 2

Análise dos contextos em swap, no IA-32 void swap(int *xp, int *yp) { int

Análise dos contextos em swap, no IA-32 void swap(int *xp, int *yp) { int t 0 = *xp; int t 1 = *yp; *xp = t 1; *yp = t 0; } void call_swap() { int zip 1 = 15213; int zip 2 = 91125; (…) swap(&zip 1, &zip 2); (…) } AJProença, Sistemas de Computação, UMinho, 2010/11 • em call_swap • na invocação de swap • na execução de swap • de volta 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 3

Construção do contexto na stack, no IA-32 call_swap %esp variáveis locais de swap 1.

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

Evolução da stack, no IA-32 (1) call_swap 1. Antes de invocar swap endereço crescente

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 t 0 = *xp; int t 1 = *yp; *xp = t 1; *yp = t 0; } void call_swap() { int zip 1 = 15213; int zip 2 = 91125; (…) swap(&zip 1, &zip 2); (…) } AJProença, Sistemas de Computação, UMinho, 2010/11 %esp %ebp-4 %ebp frame pointer zip 2 stack zip 1 antigo %ebp 5

Evolução da stack, no IA-32 (2) call_swap 2. Preparação p/ invocar swap • salvaguardar

Evolução da stack, no IA-32 (2) call_swap 2. Preparação p/ invocar swap • salvaguardar registos? . . . não. . . • passagem de parâmetros void swap(int *xp, int *yp) { int t 0 = *xp; int t 1 = *yp; *xp = t 1; *yp = t 0; } void call_swap() { int zip 1 = 15213; int zip 2 = 91125; (…) swap(&zip 1, &zip 2); (…) } AJProença, Sistemas de Computação, UMinho, 2010/11 %esp %ebp-12 endereço crescente &zip 1 &zip 2 frame pointer %ebp stack zip 1 antigo %ebp 6

Evolução da stack, no IA-32 (3) call_swap endereço crescente 2. Preparação p/ invocar swap

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 pushl -8(%ebp), %eax Calcula &zip 2 %eax Push &zip 2 -4(%ebp), %eax Calcula &zip 1 %eax Push &zip 1 %esp %ebp-12 &zip 1 &zip 2 frame pointer %ebp AJProença, Sistemas de Computação, UMinho, 2010/11 stack zip 1 antigo %ebp 7

Evolução da stack, no IA-32 (4) call_swap 3. Invocar swap • e guardar endereço

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 zip 1 = 15213; int zip 2 = 91125; (…) swap(&zip 1, &zip 2); (…) } call swap %esp &zip 1 %ebp-12 Invoca função swap frame pointer %ebp AJProença, Sistemas de Computação, UMinho, 2010/11 antigo %eip &zip 2 stack zip 1 antigo %ebp 8

Evolução da stack, no IA-32 (5) 1. Início de swap • actualizar frame pointer

Evolução da stack, no IA-32 (5) 1. Início de swap • actualizar frame pointer • salvaguardar registos • reservar espaço p/ locais. . . não. . . swap %esp void swap(int *xp, int *yp) %ebp %esp { frame pointer int t 0 = *xp; int t 1 = *yp; *xp = t 1; *yp = t 0; } swap: pushl %ebp Salvaguarda antigo %ebp movl %esp, %ebp Faz %ebp frame pointer pushl %ebx Salvaguarda %ebx antigo %ebx endereço crescente antigo %ebp antigo %eip *xp *yp zip 2 stack zip 1 antigo %ebp AJProença, Sistemas de Computação, UMinho, 2010/11 antigo %ebp 9

Evolução da stack, no IA-32 (6) 2. Corpo de swap %esp %ebp void swap(int

Evolução da stack, no IA-32 (6) 2. Corpo de swap %esp %ebp void swap(int *xp, int *yp) frame pointer { } int *xp *yp movl movl antigo %ebp endereço crescente antigo %eip t 0 = *xp; t 1 = *yp; = t 1; = t 0; 12(%ebp), %ecx 8(%ebp), %edx (%ecx), %eax (%edx), %ebx %eax, (%edx) %ebx, (%ecx) antigo %ebx %ebp+8 %ebp+12 Get yp Get xp Get y (em t 1) Get x (em t 0) Armazena y em *xp Armazena x em *yp AJProença, Sistemas de Computação, UMinho, 2010/11 *xp *yp zip 2 zip 1 stack antigo %ebp 10

Evolução da stack, no IA-32 (7) swap %esp 3. Término de swap. . .

Evolução da stack, no IA-32 (7) swap %esp 3. Término de swap. . . • libertar espaço de var locais. . . não. . . • recuperar registos • recuperar antigo frame pointer • voltar a call_swap void swap(int *xp, int *yp) { (…) } popl %ebx Recupera %ebx movl %ebp, %esp Recupera %esp popl %ebp Recupera %ebp ou leave Recupera %esp, %ebp ret Volta à f. chamadora AJProença, Sistemas de Computação, UMinho, 2010/11 antigo %ebx antigo %ebp endereço crescente antigo %eip *xp *yp zip 2 zip 1 %ebp frame pointer stack antigo %ebp 11

Evolução da stack, no IA-32 (8) call_swap 4. Terminar invocação de swap. . .

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. . . void call_swap() { int zip 1 = 15213; int zip 2 = 91125; (…) swap(&zip 1, &zip 2); (…) } addl $8, (%esp) &zip 1 *xp &zip 2 *yp %esp Actualiza stack pointer frame pointer %ebp AJProença, Sistemas de Computação, UMinho, 2010/11 endereço crescente zip 2 stack zip 1 antigo %ebp 12