• Nenhum resultado encontrado

Procedimentos Variáveis Locais

N/A
N/A
Protected

Academic year: 2021

Share "Procedimentos Variáveis Locais"

Copied!
18
0
0

Texto

(1)

Procedimentos

Variáveis Locais

Noemi Rodriguez Ana Lúcia de Moura Raúl Renteria

Alexandre Meslin

(2)

Registro de Ativação

Porção da pilha associada a uma

chamada de função

topo da pilha

base da pilha

%rsp

...

RA

%rbp

RA chamadora

...

O registrador

%rbp

(frame ou

base pointer) pode ser usado

como

base do registro de

ativação

acesso a elementos alocados no

registro de ativação da função

...

...

RAs

(3)

Registro de Ativação: registradores

RA é usado para guardar valor de

registradores callee-saved

topo da pilha

base da pilha

%rsp

...

%rbp

...

...

...

<rbp-ant> <rbx-ant> <r12-ant>

foo:

 pushq %rbp

 movq  %rsp,%rbp

 subq  

$n

,%rsp  /* multiplo 16 */

 movq  %rbx, ­8(%rbp)

 movq  %r12, ­16(%rbp)

RA RA chamadora RAs anteriores

(4)

Registro de Ativação: variáveis locais

RA também é usado para

armazenar variáveis locais

número de registradores é

insuficiente

arrays e estruturas

operador & é aplicado a uma

variável

topo da pilha

base da pilha

%rsp

...

%rbp

...

...

<rbp-ant> <regs> <vars> RA RA chamadora RAs anteriores

(5)

Alocação de Variáveis Locais

Não existe convenção para a ordenação das variáveis

locais no RA

apenas a própria função manipula seus endereços

Devem ser respeitadas as convenções de

alinhamento!

variáveis escalares, arrays e estruturas

A pilha deve permanecer alinhada em endereço

múltiplo de 16

(6)

Alocação de variáveis escalares

topo da pilha

base da pilha

%rsp

%rbp

RAs anteriores

...

<rbp-ant> int foo() {  char c = 0, d = 1;  int i = 10;  long l = 100;  ... foo:  pushq %rbp  movq %rsp, %rbp  ...

(7)

Alocação de variáveis escalares

2 * 1 4 8 int foo() {  char c = 0, d = 1;  int i = 10;  long l = 100;  ... foo:  pushq %rbp  movq %rsp, %rbp    ...

topo da pilha

base da pilha

%rsp

%rbp

RAs anteriores

...

<rbp-ant>

(8)

Alocação de variáveis escalares

2 * 1 4 8 int foo() {  char c = 0, d = 1;  int i = 10;  long l = 100;  ... foo:  pushq %rbp  movq %rsp, %rbp    ...

topo da pilha

base da pilha

%rsp

%rbp

RAs anteriores

...

<rbp-ant>

14

16

(9)

Alocação de variáveis escalares

2 * 1 4 8 int foo() {  char c = 0, d = 1;  int i = 10;  long l = 100;  ... foo:  pushq %rbp  movq %rsp, %rbp  subq $16, %rsp  ...

topo da pilha

base da pilha

%rsp

%rbp

RAs anteriores

...

<rbp-ant>

16

d c i l RA

(10)

Acesso às variáveis

int foo() {  char c = 0, d = 1;  int i = 10;  long l = 100;  ...  movb $0, ­14(%rbp) /* c */  movb $1, ­13(%rbp) /* d */  movl $10, ­12(%rbp) /* i */  movq $100, ­8(%rbp)  /* l */

topo da pilha

base da pilha

%rsp

%rbp

RAs anteriores

...

<rbp-ant> d c i l RA

(11)

Um Exemplo

int foo() {

 int i;

 scanf("%d", &i );

 return  i ;

}

Sf: .string "%d" foo:   pushq %rbp   movq  %rsp, %rbp   subq  $16, %rsp   movq  $Sf, %rdi   leaq  ­4(%rbp), %rsi   call  scanf   movl  ­4(%rbp), %eax   leave   ret

%rsp

%rbp

...

<rbp-ant> i RA

(12)

Outro Exemplo

int proc() {   int x,n=5,s=0;   while (n­­) {     scanf ("%d",&x);     s += x;   }   return s; } Sf: .string "%d" proc:  pushq %rbp  movq  %rsp, %rbp  subq  $32, %rsp  movq  %rbx, ­8(%rbp)  movq  %r12, ­16(%rbp)  movl  $5, %ebx  movl  $0, %r12d loop:  cmpl  $0, %ebx  je fim  decl  %ebx

%rsp

%rbp

...

<rbp-ant> x RA <rbx-ant>  movq  $Sf, %rdi  leaq  ­20(%rbp), %rsi  call  scanf  addl ­20(%rbp), %r12d  jmp  loop fim:  movl %r12d, %eax  movq ­8(%rbp), %rbx  movq ­16(%rbp), %r12  leave  ret <r12-ant>

(13)

Alocação de Arrays

Cálculo do endereços dos elementos de um array é

feito a partir do seu endereço inicial

o elemento de índice 0 é o primeiro elemento, e deve estar

armazenado no

menor

endereço

a[0] a[1] ... a[i] ...

endereços crescem endereços crescem a[0] a[1] ... a[i] ...

(14)

Exemplo de Arrays Locais

int foo() {  int v1[3];  long v2[2];  boo(v1, v2);   ... }  foo:   pushq %rbp   movq  %rsp, %rbp      

%rbp

...

<rbp-ant>

%rsp

(15)

Exemplo de Arrays Locais

int foo() {  int v1[3];  long v2[2];  boo(v1, v2);   ... }  foo:   pushq %rbp   movq  %rsp, %rbp      

%rbp

...

<rbp-ant>

%rsp

3 * 4 2 * 8

(16)

Exemplo de Arrays Locais

int foo() {  int v1[3];  long v2[2];  boo(v1, v2);   ... }  foo:   pushq %rbp   movq  %rsp, %rbp      

%rbp

...

<rbp-ant>

%rsp

3 * 4 2 * 8

28

32

(17)

Exemplo de Arrays Locais

int foo() {  int v1[3];  long v2[2];  boo(v1, v2);   ... }  foo:   pushq %rbp   movq  %rsp, %rbp   subq  $32, %rsp      

%rbp

...

<rbp-ant> 3 * 4 2 * 8

32

v1[1] v1[0] v1[2] v2[0] v2[1]

%rsp

RA

(18)

Exemplo de Arrays Locais

int foo() {  int v1[3];  long v2[2];  boo(v1, v2);   ... }  foo:   pushq %rbp   movq  %rsp, %rbp   subq  $32, %rsp   leaq  ­32(%rbp), %rdi   leaq  ­16(%rbp), %rsi   call  boo   ...

%rbp

...

<rbp-ant> 3 * 4 2 * 8

32

v1[1] v1[0] v1[2] v2[0] v2[1]

%rsp

RA

-32

-16

Referências

Documentos relacionados

Fernandes, morador no lugar de Ourentã, termo da Vila de Cantanhede e de Francisco Afonso, morador no lugar de Fornos, termo da cidade de Coimbra, para fornecimento de

Na questão que abordou o conhecimento sobre a localização da doença, o deficiente saber quanto à percepção sobre a saúde bucal foi comprovado quando somente 30 indivíduos

Portanto, deve-se reconhecer que o tipo de movimento ortodôntico pode influenciar no risco de desenvolvimento de recessão óssea e gengival, como nos casos de movimento

REDES INSTALACAO E COMERCIO DE REDES

Haveria agora algo que dizer -e haverá muito mais que estudar, pois não têm sido regiões que tenham merecido particular atenção por parte dos historiadores- sobre certas

Fazendo-se um paralelo à critica de projetos residenciais em São Paulo, Diane Ghia- rardo (2002), apresenta em seu livro criticas a projetos de usos diversos e a relação com o

[r]

O presente documento pretende registar a análise efectuada pela equipa gestora do Portal CampingCar Portugal (Portal Português de Autocaravanismo) ao estudo de