PASSAGEM DE PARÂMETROS ENTRE ROTINAS
PASSAGEM DE PARÂMETROS ENTRE ROTINAS
QUANDO UMA ROTINA CHAMA OUTRA ATRAVÉS DE UMA INSTRUÇÃO CALL,
NECESSITA, ÀS VEZES, TRANSFERIR DADOS, OU PONTEIROS PARA DADOS, SOBRE OS QUAIS A ROTINA CHAMADA DEVERÁ ATUAR.
QUANDO UMA ROTINA CHAMA OUTRA ATRAVÉS DE UMA INSTRUÇÃO CALL,
NECESSITA, ÀS VEZES, TRANSFERIR DADOS, OU PONTEIROS PARA DADOS, SOBRE OS QUAIS A ROTINA CHAMADA DEVERÁ ATUAR.
AS DUAS FORMAS MAIS COMUNS DE SE TRANSFERIR DADOS ENTRE ROTINAS SÃO: - ATRAVÉS DE REGISTRADORES DA CPU
- COPIANDO-OS PARA ALGUM LUGAR PREDEFINIDO NA MEMÓRIA
AS DUAS FORMAS MAIS COMUNS DE SE TRANSFERIR DADOS ENTRE ROTINAS SÃO: - ATRAVÉS DE REGISTRADORES DA CPU
- COPIANDO-OS PARA ALGUM LUGAR PREDEFINIDO NA MEMÓRIA
A PRIMEIRA ALTERNATIVA →→→→ MAIS EFICIENTE EM TERMOS DE VELOCIDADE LIMITAÇÃO: →→→→ ESCASSEZ DE REGISTRADORES DISPONÍVEIS A PRIMEIRA ALTERNATIVA →→→→ MAIS EFICIENTE EM TERMOS DE VELOCIDADE LIMITAÇÃO: →→→→ ESCASSEZ DE REGISTRADORES DISPONÍVEIS
A SEGUNDA ALTERNATIVA:
EFICIÊNCIA PODE SER MELHORADA ESTRUTURANDO-SE A ÁREA DE MEMÓRIA UTILIZADA NA FORMA DE UMA PILHA (BUFFER LIFO). A SEGUNDA ALTERNATIVA:
EFICIÊNCIA PODE SER MELHORADA ESTRUTURANDO-SE A ÁREA DE MEMÓRIA UTILIZADA NA FORMA DE UMA PILHA (BUFFER LIFO).
ESTRUTURA E OPERAÇÃO DA PILHA
ESTRUTURA E OPERAÇÃO DA PILHA
REGISTRADOR SS APONTA PARA O INÍCIO DO
SEGMENTO DE PILHA (VIA DESCRITOR) L IM IT E LIMITE ESPECIFICA O TAMANHO MÁXIMO DA PILHA REGISTRADOR ESP
APONTA PARA O ÚLTIMO DADO INSERIDO NA PILHA (VIA INSTRUÇÃO PUSH)
REGISTRADOR EBP
APONTA PARA DADOS NO SEGMENTO DE PILHA OPERAÇÃO PUSH X:
INSERE UM DADO NA PILHA
A) DECREMENTA ESP B) COPIA O DADO X PARA A POSIÇÃO APONTADA POR ESP
OPERAÇÃO POP X:
EXTRAI UM DADO DA PILHA
A) COPIA O DADO APONTADO POR ESP PARA X
B) INCREMENTA ESP
OFFSET 0
OFFSET MÁXIMO (LIMITE)
TOS = TOP OF THE STACK
4 BYTES (DEFAULT)
PILHA (STACK)
LARGURA DOS OPERANDOS EM BITS NA ARQUITETURA IA-32
LARGURA DOS OPERANDOS EM BITS NA ARQUITETURA IA-32
UM SEGMENTO DE CÓDIGO POSSUI EM SEU DESCRITOR UM BIT - BIT D - QUE ESPECIFICA A LARGURA “DEFAULT” DOS DADOS SOBRE OS QUAIS OPERA. UM SEGMENTO DE CÓDIGO POSSUI EM SEU DESCRITOR UM BIT - BIT D - QUE ESPECIFICA A LARGURA “DEFAULT” DOS DADOS SOBRE OS QUAIS OPERA.
BIT D = 0 →→→→ LARGURA DEFAULT DOS OPERANDOS É 16 BITS BIT D = 1 →→→→ LARGURA DEFAULT DOS OPERANDOS É 32 BITS BIT D = 0 →→→→ LARGURA DEFAULT DOS OPERANDOS É 16 BITS BIT D = 1 →→→→ LARGURA DEFAULT DOS OPERANDOS É 32 BITS
INSTRUÇÕES PUSH E POP TRANFEREM DADOS PARA E DA PILHA COM A LARGURA DEFAULT DO SEGMENTO DE CÓDIGO QUE ESTÁ EXECUTANDO:
- 4 BYTES PARA SEGMENTOS DE CÓDIGO DE 32 BITS E - 2 BYTES PARA SEGMENTOS DE CÓDIGO DE 16 BITS.
INSTRUÇÕES PUSH E POP TRANFEREM DADOS PARA E DA PILHA COM A LARGURA DEFAULT DO SEGMENTO DE CÓDIGO QUE ESTÁ EXECUTANDO:
- 4 BYTES PARA SEGMENTOS DE CÓDIGO DE 32 BITS E - 2 BYTES PARA SEGMENTOS DE CÓDIGO DE 16 BITS.
PODE-SE ALTERAR A LARGURA DEFAULT DO OPERANDO TRANSFERIDO POR PUSH E POP (E TAMBÉM DAS INSTRUÇÕES MOV EM CASO DE SEGMENTO DE DADOS)
PREFIXANDO-SE AS INSTRUÇÕES PUSH E POP (OU MOV) COM O PREFIXO 66H.
PODE-SE ALTERAR A LARGURA DEFAULT DO OPERANDO TRANSFERIDO POR PUSH E POP (E TAMBÉM DAS INSTRUÇÕES MOV EM CASO DE SEGMENTO DE DADOS)
LARGURA DOS OPERANDOS - EXEMPLOS
LARGURA DOS OPERANDOS - EXEMPLOS
SEGMENTO DE CÓDIGO DE 32 BITS ( BIT D = 1). SEGMENTO DE CÓDIGO DE 32 BITS ( BIT D = 1).
INSTRUÇÃO:
INSTRUÇÃO: CODIFICAÇÃO:CODIFICAÇÃO: EFEITO:EFEITO:
PUSH EAX
PUSH EAX 50 h50 h INSERE 32 BITS DE EAX NA A PILHAINSERE 32 BITS DE EAX NA A PILHA
PUSH AX
PUSH AX 66 50 h66 50 h INSERE 16 BITS DE AX NA A PILHAINSERE 16 BITS DE AX NA A PILHA
SEGMENTO DE CÓDIGO DE 16 BITS ( BIT D = 0). SEGMENTO DE CÓDIGO DE 16 BITS ( BIT D = 0).
INSTRUÇÃO:
INSTRUÇÃO: CODIFICAÇÃO:CODIFICAÇÃO: EFEITO:EFEITO:
PUSH EAX
PUSH EAX 66 50 h66 50 h INSERE 32 BITS DE EAX NA A PILHAINSERE 32 BITS DE EAX NA A PILHA
PUSH AX
UTILIZAÇÃO DA PILHA PARA PASSAGEM DE PARÂMETROS
UTILIZAÇÃO DA PILHA PARA PASSAGEM DE PARÂMETROS
QUANDO UMA ROTINA (OU FUNÇÃO) CHAMADORA PASSA PARÂMETROS PARA UMA ROTINA (OU FUNÇÃO) CHAMADA ATRAVÉS DA PILHA, É NECESSÁRIO
CONVENCIONAR NO MÍNIMO:
A) A SEQÜÊNCIA EM QUE OS PARÂMETROS SERÃO PASSADOS.
B) QUAL DAS DUAS ROTINAS - CHAMADORA OU CHAMADA - FICARÁ ENCARREGADA DA RETIRADA (LIMPEZA) DOS DADOS DA PILHA AO FINAL DA EXECUÇÃO.
QUANDO UMA ROTINA (OU FUNÇÃO) CHAMADORA PASSA PARÂMETROS PARA UMA ROTINA (OU FUNÇÃO) CHAMADA ATRAVÉS DA PILHA, É NECESSÁRIO
CONVENCIONAR NO MÍNIMO:
A) A SEQÜÊNCIA EM QUE OS PARÂMETROS SERÃO PASSADOS.
B) QUAL DAS DUAS ROTINAS - CHAMADORA OU CHAMADA - FICARÁ ENCARREGADA DA RETIRADA (LIMPEZA) DOS DADOS DA PILHA AO FINAL DA EXECUÇÃO.
OS DOIS CRITÉRIOS ACIMA PERMITEM ESTABELECER DIVERSAS CONVENÇÕES DE CHAMADA.
OS DOIS CRITÉRIOS ACIMA PERMITEM ESTABELECER DIVERSAS CONVENÇÕES DE CHAMADA.
CONVENÇÃO DE CHAMADA:
CONVENÇÃO DE CHAMADA: SEQÜÊNCIA:SEQÜÊNCIA: LIMPEZA:LIMPEZA:
C:
C: DIREITA PARA ESQUERDADIREITA PARA ESQUERDA CHAMADORACHAMADORA
STDCALL:
STDCALL: DIREITA PARA ESQUERDADIREITA PARA ESQUERDA CHAMADACHAMADA
PASCAL:
PASSAGEM DE PARÂMETROS NA LINGUAGEM C
PASSAGEM DE PARÂMETROS NA LINGUAGEM C
s = MyFunc(x,y,z);
int MyFunc( int a, int b, int c) {
return a + b + c; }
mov eax, dword ptr [z] push eax
mov eax, dword ptr [y] push eax
mov eax, dword ptr [x] push eax
call _MyFunc
add esp, 12; limpeza mov dword ptr [s], eax
push ebp ; prólogo mov ebp, esp
mov eax, dword ptr [ebp+8] ; eax = a add eax, dword ptr [ebp+12]; eax += b add eax, dword ptr [ebp+16]; eax += c pop ebp ; epílogo ret esp (0) PILHA z esp (1) y esp (2) x esp (3) return address esp (4)
ebp old ebp esp (5)
ebp+4 ebp+8 ebp+12 ebp+16 STACK FRAME STACK FRAME STACK FRAME STACK FRAME
VARIÁVEIS LOCAIS NA LINGUAGEM C
VARIÁVEIS LOCAIS NA LINGUAGEM C
int MyFunc( int a, int b, int c) {
int var1,var2; var1 = a + b; var2 = c;
return var1 + var2; }
push ebp ; prólogo mov ebp, esp
sub esp, 8 ; var. locais mov eax, dword ptr [ebp+8] ; eax = a
add eax, dword ptr [ebp+12]; eax += b mov dword ptr [ebp-4], eax ; var1 = a+b mov eax, dword ptr [ebp+16]; eax = c mov dword ptr [ebp-8], eax ; var2 = c add eax, dword ptr [ebp] ; eax += var1 mov esp, ebp ; fim var loc pop ebp ; epílogo
ret esp (0) PILHA s = MyFunc(x,y,z); z esp (1) y esp (2) x esp (3) return address esp (4) old ebp esp (5) ebp ebp+4 ebp+8 ebp+12 ebp+16 ebp-4 ebp-8 var1 var2 esp (6)
OFFSETS POSITIVOS EM RELAÇÃO A EBP INDICAM PARÂMETROS
OFFSETS POSITIVOS EM RELAÇÃO A EBP INDICAM PARÂMETROS
OFFSETS NEGATIVOS EM RELAÇÃO A EBP INDICAM VARIÁVEIS LOCAIS OFFSETS NEGATIVOS EM RELAÇÃO A EBP INDICAM VARIÁVEIS LOCAIS
STACK FRAME STACK FRAMESTACK FRAME STACK FRAME
COMPARAÇÃO ENTRE CONVENÇÕES DE CHAMADA - SEQÜÊNCIA
COMPARAÇÃO ENTRE CONVENÇÕES DE CHAMADA - SEQÜÊNCIA
TRANSFERIR PARÂMETROS PARA A PILHA DA TRANSFERIR PARÂMETROS PARA A PILHA DA TRANSFERIR PARÂMETROS PARA A PILHA DA
TRANSFERIR PARÂMETROS PARA A PILHA DA DIREITA PARA A ESQUERDADIREITA PARA A ESQUERDADIREITA PARA A ESQUERDADIREITA PARA A ESQUERDA, OU SEJA,, OU SEJA,, OU SEJA,, OU SEJA, INICIANDO PELO ÚLTIMO, TEM A VANTAGEM QUE
INICIANDO PELO ÚLTIMO, TEM A VANTAGEM QUE INICIANDO PELO ÚLTIMO, TEM A VANTAGEM QUE
INICIANDO PELO ÚLTIMO, TEM A VANTAGEM QUE A POSIÇÃO RELATIVA DO PRIMEIROA POSIÇÃO RELATIVA DO PRIMEIROA POSIÇÃO RELATIVA DO PRIMEIROA POSIÇÃO RELATIVA DO PRIMEIRO PARÂMETRO NA PILHA SERÁ SEMPRE A MESMA
PARÂMETRO NA PILHA SERÁ SEMPRE A MESMA PARÂMETRO NA PILHA SERÁ SEMPRE A MESMA PARÂMETRO NA PILHA SERÁ SEMPRE A MESMA TRANSFERIR PARÂMETROS PARA A PILHA DA TRANSFERIR PARÂMETROS PARA A PILHA DA TRANSFERIR PARÂMETROS PARA A PILHA DA
TRANSFERIR PARÂMETROS PARA A PILHA DA DIREITA PARA A ESQUERDADIREITA PARA A ESQUERDADIREITA PARA A ESQUERDADIREITA PARA A ESQUERDA, OU SEJA,, OU SEJA,, OU SEJA,, OU SEJA, INICIANDO PELO ÚLTIMO, TEM A VANTAGEM QUE
INICIANDO PELO ÚLTIMO, TEM A VANTAGEM QUE INICIANDO PELO ÚLTIMO, TEM A VANTAGEM QUE
INICIANDO PELO ÚLTIMO, TEM A VANTAGEM QUE A POSIÇÃO RELATIVA DO PRIMEIROA POSIÇÃO RELATIVA DO PRIMEIROA POSIÇÃO RELATIVA DO PRIMEIROA POSIÇÃO RELATIVA DO PRIMEIRO PARÂMETRO NA PILHA SERÁ SEMPRE A MESMA
PARÂMETRO NA PILHA SERÁ SEMPRE A MESMA PARÂMETRO NA PILHA SERÁ SEMPRE A MESMA PARÂMETRO NA PILHA SERÁ SEMPRE A MESMA
NO EXEMPLO ANTERIOR, ISSO SIGNIFICA QUE O PRIMEIRO PARÂMETRO PODERÁ SER NO EXEMPLO ANTERIOR, ISSO SIGNIFICA QUE O PRIMEIRO PARÂMETRO PODERÁ SER NO EXEMPLO ANTERIOR, ISSO SIGNIFICA QUE O PRIMEIRO PARÂMETRO PODERÁ SER NO EXEMPLO ANTERIOR, ISSO SIGNIFICA QUE O PRIMEIRO PARÂMETRO PODERÁ SER ACESSADO SEMPRE NO OFFSET
ACESSADO SEMPRE NO OFFSET ACESSADO SEMPRE NO OFFSET
ACESSADO SEMPRE NO OFFSET [EBP+8][EBP+8][EBP+8][EBP+8], O SEGUNDO SEMPRE EM , O SEGUNDO SEMPRE EM , O SEGUNDO SEMPRE EM , O SEGUNDO SEMPRE EM [EBP+12][EBP+12][EBP+12][EBP+12], ETC., ETC., ETC., ETC. NO EXEMPLO ANTERIOR, ISSO SIGNIFICA QUE O PRIMEIRO PARÂMETRO PODERÁ SER NO EXEMPLO ANTERIOR, ISSO SIGNIFICA QUE O PRIMEIRO PARÂMETRO PODERÁ SER NO EXEMPLO ANTERIOR, ISSO SIGNIFICA QUE O PRIMEIRO PARÂMETRO PODERÁ SER NO EXEMPLO ANTERIOR, ISSO SIGNIFICA QUE O PRIMEIRO PARÂMETRO PODERÁ SER ACESSADO SEMPRE NO OFFSET
ACESSADO SEMPRE NO OFFSET ACESSADO SEMPRE NO OFFSET
ACESSADO SEMPRE NO OFFSET [EBP+8][EBP+8][EBP+8][EBP+8], O SEGUNDO SEMPRE EM , O SEGUNDO SEMPRE EM , O SEGUNDO SEMPRE EM , O SEGUNDO SEMPRE EM [EBP+12][EBP+12][EBP+12][EBP+12], ETC., ETC., ETC., ETC.
ISSO ISSO ISSO
ISSO PERMITE OPERAR COM UM NÚMERO VARIÁVEL DE PARÂMETROSPERMITE OPERAR COM UM NÚMERO VARIÁVEL DE PARÂMETROSPERMITE OPERAR COM UM NÚMERO VARIÁVEL DE PARÂMETROSPERMITE OPERAR COM UM NÚMERO VARIÁVEL DE PARÂMETROS PARA A PARA A PARA A PARA A MESMA ROTINA, UMA VEZ QUE OS PARÂMETROS ESTARÂO SEMPRE NAS MESMAS MESMA ROTINA, UMA VEZ QUE OS PARÂMETROS ESTARÂO SEMPRE NAS MESMAS MESMA ROTINA, UMA VEZ QUE OS PARÂMETROS ESTARÂO SEMPRE NAS MESMAS MESMA ROTINA, UMA VEZ QUE OS PARÂMETROS ESTARÂO SEMPRE NAS MESMAS POSIÇÕES RELATIVAS, INDEPENDENTEMENTE DE QUANTOS FOREM TRANSFERIDOS. POSIÇÕES RELATIVAS, INDEPENDENTEMENTE DE QUANTOS FOREM TRANSFERIDOS. POSIÇÕES RELATIVAS, INDEPENDENTEMENTE DE QUANTOS FOREM TRANSFERIDOS. POSIÇÕES RELATIVAS, INDEPENDENTEMENTE DE QUANTOS FOREM TRANSFERIDOS. ISSO
ISSO ISSO
ISSO PERMITE OPERAR COM UM NÚMERO VARIÁVEL DE PARÂMETROSPERMITE OPERAR COM UM NÚMERO VARIÁVEL DE PARÂMETROSPERMITE OPERAR COM UM NÚMERO VARIÁVEL DE PARÂMETROSPERMITE OPERAR COM UM NÚMERO VARIÁVEL DE PARÂMETROS PARA A PARA A PARA A PARA A MESMA ROTINA, UMA VEZ QUE OS PARÂMETROS ESTARÂO SEMPRE NAS MESMAS MESMA ROTINA, UMA VEZ QUE OS PARÂMETROS ESTARÂO SEMPRE NAS MESMAS MESMA ROTINA, UMA VEZ QUE OS PARÂMETROS ESTARÂO SEMPRE NAS MESMAS MESMA ROTINA, UMA VEZ QUE OS PARÂMETROS ESTARÂO SEMPRE NAS MESMAS POSIÇÕES RELATIVAS, INDEPENDENTEMENTE DE QUANTOS FOREM TRANSFERIDOS. POSIÇÕES RELATIVAS, INDEPENDENTEMENTE DE QUANTOS FOREM TRANSFERIDOS. POSIÇÕES RELATIVAS, INDEPENDENTEMENTE DE QUANTOS FOREM TRANSFERIDOS. POSIÇÕES RELATIVAS, INDEPENDENTEMENTE DE QUANTOS FOREM TRANSFERIDOS.
COMPARAÇÃO ENTRE CONVENÇÕES DE CHAMADA - LIMPEZA
COMPARAÇÃO ENTRE CONVENÇÕES DE CHAMADA - LIMPEZA
A RETIRADA DOS PARÂMETROS DA PILHA APÓS A EXECUÇÃO DA ROTINA CHAMADA, A RETIRADA DOS PARÂMETROS DA PILHA APÓS A EXECUÇÃO DA ROTINA CHAMADA, A RETIRADA DOS PARÂMETROS DA PILHA APÓS A EXECUÇÃO DA ROTINA CHAMADA, A RETIRADA DOS PARÂMETROS DA PILHA APÓS A EXECUÇÃO DA ROTINA CHAMADA, OU SEJA, A
OU SEJA, A OU SEJA, A
OU SEJA, A “LIMPEZA” DA PILHA“LIMPEZA” DA PILHA“LIMPEZA” DA PILHA“LIMPEZA” DA PILHA, PODE SER EXECUTADA TANTO PELA FUNÇÃO, PODE SER EXECUTADA TANTO PELA FUNÇÃO, PODE SER EXECUTADA TANTO PELA FUNÇÃO, PODE SER EXECUTADA TANTO PELA FUNÇÃO CHAMADA QUANTO PELA FUNÇÃO CHAMADORA.
CHAMADA QUANTO PELA FUNÇÃO CHAMADORA. CHAMADA QUANTO PELA FUNÇÃO CHAMADORA. CHAMADA QUANTO PELA FUNÇÃO CHAMADORA.
A RETIRADA DOS PARÂMETROS DA PILHA APÓS A EXECUÇÃO DA ROTINA CHAMADA, A RETIRADA DOS PARÂMETROS DA PILHA APÓS A EXECUÇÃO DA ROTINA CHAMADA, A RETIRADA DOS PARÂMETROS DA PILHA APÓS A EXECUÇÃO DA ROTINA CHAMADA, A RETIRADA DOS PARÂMETROS DA PILHA APÓS A EXECUÇÃO DA ROTINA CHAMADA, OU SEJA, A
OU SEJA, A OU SEJA, A
OU SEJA, A “LIMPEZA” DA PILHA“LIMPEZA” DA PILHA“LIMPEZA” DA PILHA“LIMPEZA” DA PILHA, PODE SER EXECUTADA TANTO PELA FUNÇÃO, PODE SER EXECUTADA TANTO PELA FUNÇÃO, PODE SER EXECUTADA TANTO PELA FUNÇÃO, PODE SER EXECUTADA TANTO PELA FUNÇÃO CHAMADA QUANTO PELA FUNÇÃO CHAMADORA.
CHAMADA QUANTO PELA FUNÇÃO CHAMADORA. CHAMADA QUANTO PELA FUNÇÃO CHAMADORA. CHAMADA QUANTO PELA FUNÇÃO CHAMADORA.
A EXECUÇÃO DA LIMPEZA PELA FUNÇÃO CHAMADORA TEM VANTAGENS E DESVAN-A EXECUÇÃO DDESVAN-A LIMPEZDESVAN-A PELDESVAN-A FUNÇÃO CHDESVAN-AMDESVAN-ADORDESVAN-A TEM VDESVAN-ANTDESVAN-AGENS E DESVDESVAN-AN-A EXECUÇÃO DA LIMPEZA PELA FUNÇÃO CHAMADORA TEM VANTAGENS E A EXECUÇÃO DA LIMPEZA PELA FUNÇÃO CHAMADORA TEM VANTAGENS E DESVAN- DESVAN-TAGENS EM RELAÇÃO À LIMPELA PELA FUNÇÃO CHAMADA:
TAGENS EM RELAÇÃO À LIMPELA PELA FUNÇÃO CHAMADA:TAGENS EM RELAÇÃO À LIMPELA PELA FUNÇÃO CHAMADA: TAGENS EM RELAÇÃO À LIMPELA PELA FUNÇÃO CHAMADA:
A EXECUÇÃO DA LIMPEZA PELA FUNÇÃO CHAMADORA TEM VANTAGENS E DESVAN-A EXECUÇÃO DDESVAN-A LIMPEZDESVAN-A PELDESVAN-A FUNÇÃO CHDESVAN-AMDESVAN-ADORDESVAN-A TEM VDESVAN-ANTDESVAN-AGENS E DESVDESVAN-AN-A EXECUÇÃO DA LIMPEZA PELA FUNÇÃO CHAMADORA TEM VANTAGENS E A EXECUÇÃO DA LIMPEZA PELA FUNÇÃO CHAMADORA TEM VANTAGENS E DESVAN- DESVAN-TAGENS EM RELAÇÃO À LIMPELA PELA FUNÇÃO CHAMADA:
TAGENS EM RELAÇÃO À LIMPELA PELA FUNÇÃO CHAMADA:TAGENS EM RELAÇÃO À LIMPELA PELA FUNÇÃO CHAMADA: TAGENS EM RELAÇÃO À LIMPELA PELA FUNÇÃO CHAMADA:
VANTAGEM: VANTAGEM: VANTAGEM: VANTAGEM:
PERMITE A OPERAÇÃO COM UM NÚMERO VARIÁVEL DE PARÂMETROS, POIS SOMEN-PERMITE A OPERAÇÃO COM UM NÚMERO VARIÁVEL DE PARÂMETROS, POIS SOMEN-PERMITE A OPERAÇÃO COM UM NÚMERO VARIÁVEL DE PARÂMETROS, POIS PERMITE A OPERAÇÃO COM UM NÚMERO VARIÁVEL DE PARÂMETROS, POIS SOMEN-TE A FUNÇÃO CHAMADORA SABE QUANTOS PARÂMETROS PASSOU E PORTANTO TE A FUNÇÃO CHAMADORA SABE QUANTOS PARÂMETROS PASSOU E PORTANTOTE A FUNÇÃO CHAMADORA SABE QUANTOS PARÂMETROS PASSOU E PORTANTO TE A FUNÇÃO CHAMADORA SABE QUANTOS PARÂMETROS PASSOU E PORTANTO QUANTOS DEVE RETIRAR DA PILHA.
QUANTOS DEVE RETIRAR DA PILHA.QUANTOS DEVE RETIRAR DA PILHA. QUANTOS DEVE RETIRAR DA PILHA.
VANTAGEM: VANTAGEM: VANTAGEM: VANTAGEM:
PERMITE A OPERAÇÃO COM UM NÚMERO VARIÁVEL DE PARÂMETROS, POIS SOMEN-PERMITE A OPERAÇÃO COM UM NÚMERO VARIÁVEL DE PARÂMETROS, POIS SOMEN-PERMITE A OPERAÇÃO COM UM NÚMERO VARIÁVEL DE PARÂMETROS, POIS PERMITE A OPERAÇÃO COM UM NÚMERO VARIÁVEL DE PARÂMETROS, POIS SOMEN-TE A FUNÇÃO CHAMADORA SABE QUANTOS PARÂMETROS PASSOU E PORTANTO TE A FUNÇÃO CHAMADORA SABE QUANTOS PARÂMETROS PASSOU E PORTANTOTE A FUNÇÃO CHAMADORA SABE QUANTOS PARÂMETROS PASSOU E PORTANTO TE A FUNÇÃO CHAMADORA SABE QUANTOS PARÂMETROS PASSOU E PORTANTO QUANTOS DEVE RETIRAR DA PILHA.
QUANTOS DEVE RETIRAR DA PILHA.QUANTOS DEVE RETIRAR DA PILHA. QUANTOS DEVE RETIRAR DA PILHA.
DESVANTAGEM: DESVANTAGEM: DESVANTAGEM: DESVANTAGEM:
O CÓDIGO DE LIMPEZA É DUPLICADO A CADA CHAMADA DA ROTINA. O CÓDIGO DE LIMPEZA É DUPLICADO A CADA CHAMADA DA ROTINA. O CÓDIGO DE LIMPEZA É DUPLICADO A CADA CHAMADA DA ROTINA. O CÓDIGO DE LIMPEZA É DUPLICADO A CADA CHAMADA DA ROTINA.
DESVANTAGEM: DESVANTAGEM: DESVANTAGEM: DESVANTAGEM:
O CÓDIGO DE LIMPEZA É DUPLICADO A CADA CHAMADA DA ROTINA. O CÓDIGO DE LIMPEZA É DUPLICADO A CADA CHAMADA DA ROTINA. O CÓDIGO DE LIMPEZA É DUPLICADO A CADA CHAMADA DA ROTINA. O CÓDIGO DE LIMPEZA É DUPLICADO A CADA CHAMADA DA ROTINA.
LIMPEZA DA PILHA PELA FUNÇÃO CHAMADA
LIMPEZA DA PILHA PELA FUNÇÃO CHAMADA
int __stdcall MyFunc( int a, int b, int c) {
int var1,var2; var1 = a + b; var2 = c;
return var1 + var2; }
push ebp ; prólogo -> salva stack frame anterior mov ebp, esp ; estabelece novo stack frame
sub esp, 8 ; cria 2 variáveis locais mov eax, dword ptr [ebp+8] ; eax = a
add eax, dword ptr [ebp+12]; eax += b mov dword ptr [ebp-4], eax ; var1 = a+b mov eax, dword ptr [ebp+16]; eax = c mov dword ptr [ebp-8], eax ; var2 = c add eax, dword ptr [ebp] ; eax += var1
mov esp, ebp ; epílogo -> destrói as variáveis locais pop ebp ; restaura stack frame anterior
ret 12 ; retorna e retira 3 parâmetros ; da pilha (3 x 4 = 12 bytes) CARACTERIZA CARACTERIZA CARACTERIZA CARACTERIZA CONVENÇÃO CONVENÇÃO CONVENÇÃO CONVENÇÃO DE CHAMADA DE CHAMADA DE CHAMADA DE CHAMADA STDCALL STDCALL STDCALL STDCALL LIMPEZA DA PILHA LIMPEZA DA PILHALIMPEZA DA PILHA LIMPEZA DA PILHA EXECUTADA PELA EXECUTADA PELAEXECUTADA PELA EXECUTADA PELA FUNÇÃO CHAMADA FUNÇÃO CHAMADAFUNÇÃO CHAMADA FUNÇÃO CHAMADA
ACESSO A STACK FRAME(S) DE FUNÇÕES CHAMADORAS
ACESSO A STACK FRAME(S) DE FUNÇÕES CHAMADORAS
NOS CENÁRIOS APRESENTADOS ATÉ AQUI, A NOS CENÁRIOS APRESENTADOS ATÉ AQUI, A NOS CENÁRIOS APRESENTADOS ATÉ AQUI, A
NOS CENÁRIOS APRESENTADOS ATÉ AQUI, A FUNÇÃO CHAMADAFUNÇÃO CHAMADAFUNÇÃO CHAMADA PODE TER ACESSOFUNÇÃO CHAMADA PODE TER ACESSO PODE TER ACESSO PODE TER ACESSO AO
AO AO
AO STACK FRAME DA FUNÇÃO CHAMADORASTACK FRAME DA FUNÇÃO CHAMADORASTACK FRAME DA FUNÇÃO CHAMADORA, UMA VEZ QUE O VALOR DOSTACK FRAME DA FUNÇÃO CHAMADORA, UMA VEZ QUE O VALOR DO, UMA VEZ QUE O VALOR DO, UMA VEZ QUE O VALOR DO REGISTRADOR
REGISTRADOR REGISTRADOR
REGISTRADOR EBPEBPEBPEBP DA FUNÇÃO CHAMADORA FOI SALVO NA PILHA E ESTÁ DA FUNÇÃO CHAMADORA FOI SALVO NA PILHA E ESTÁ DA FUNÇÃO CHAMADORA FOI SALVO NA PILHA E ESTÁ DA FUNÇÃO CHAMADORA FOI SALVO NA PILHA E ESTÁ DISPONÍVEL NO OFFSET
DISPONÍVEL NO OFFSET DISPONÍVEL NO OFFSET
DISPONÍVEL NO OFFSET [EBP] [EBP] [EBP] (EBP APONTA PARRA “OLD EBP”).[EBP] (EBP APONTA PARRA “OLD EBP”). (EBP APONTA PARRA “OLD EBP”). (EBP APONTA PARRA “OLD EBP”). NOS CENÁRIOS APRESENTADOS ATÉ AQUI, A
NOS CENÁRIOS APRESENTADOS ATÉ AQUI, A NOS CENÁRIOS APRESENTADOS ATÉ AQUI, A
NOS CENÁRIOS APRESENTADOS ATÉ AQUI, A FUNÇÃO CHAMADAFUNÇÃO CHAMADAFUNÇÃO CHAMADAFUNÇÃO CHAMADA PODE TER ACESSO PODE TER ACESSO PODE TER ACESSO PODE TER ACESSO AO
AO AO
AO STACK FRAME DA FUNÇÃO CHAMADORASTACK FRAME DA FUNÇÃO CHAMADORASTACK FRAME DA FUNÇÃO CHAMADORASTACK FRAME DA FUNÇÃO CHAMADORA, UMA VEZ QUE O VALOR DO, UMA VEZ QUE O VALOR DO, UMA VEZ QUE O VALOR DO, UMA VEZ QUE O VALOR DO REGISTRADOR
REGISTRADOR REGISTRADOR
REGISTRADOR EBPEBPEBPEBP DA FUNÇÃO CHAMADORA FOI SALVO NA PILHA E ESTÁ DA FUNÇÃO CHAMADORA FOI SALVO NA PILHA E ESTÁ DA FUNÇÃO CHAMADORA FOI SALVO NA PILHA E ESTÁ DA FUNÇÃO CHAMADORA FOI SALVO NA PILHA E ESTÁ DISPONÍVEL NO OFFSET
DISPONÍVEL NO OFFSET DISPONÍVEL NO OFFSET
DISPONÍVEL NO OFFSET [EBP] [EBP] [EBP] (EBP APONTA PARRA “OLD EBP”).[EBP] (EBP APONTA PARRA “OLD EBP”). (EBP APONTA PARRA “OLD EBP”). (EBP APONTA PARRA “OLD EBP”).
ASSIM, UMA FUNÇÃO CHAMADA PODE, EM TEORIA, ACESSAR RECURSIVAMENTE ASSIM, UMA FUNÇÃO CHAMADA PODE, EM TEORIA, ACESSAR RECURSIVAMENTE ASSIM, UMA FUNÇÃO CHAMADA PODE, EM TEORIA, ACESSAR RECURSIVAMENTE ASSIM, UMA FUNÇÃO CHAMADA PODE, EM TEORIA, ACESSAR RECURSIVAMENTE TODAS AS VARIÁVEIS LOCAIS E PARÂMETROS DE TODA A CADEIA DE FUNÇÕES TODAS AS VARIÁVEIS LOCAIS E PARÂMETROS DE TODA A CADEIA DE FUNÇÕES TODAS AS VARIÁVEIS LOCAIS E PARÂMETROS DE TODA A CADEIA DE FUNÇÕES TODAS AS VARIÁVEIS LOCAIS E PARÂMETROS DE TODA A CADEIA DE FUNÇÕES CHAMADORAS QUE A PRECEDERAM.
CHAMADORAS QUE A PRECEDERAM. CHAMADORAS QUE A PRECEDERAM. CHAMADORAS QUE A PRECEDERAM.
ASSIM, UMA FUNÇÃO CHAMADA PODE, EM TEORIA, ACESSAR RECURSIVAMENTE ASSIM, UMA FUNÇÃO CHAMADA PODE, EM TEORIA, ACESSAR RECURSIVAMENTE ASSIM, UMA FUNÇÃO CHAMADA PODE, EM TEORIA, ACESSAR RECURSIVAMENTE ASSIM, UMA FUNÇÃO CHAMADA PODE, EM TEORIA, ACESSAR RECURSIVAMENTE TODAS AS VARIÁVEIS LOCAIS E PARÂMETROS DE TODA A CADEIA DE FUNÇÕES TODAS AS VARIÁVEIS LOCAIS E PARÂMETROS DE TODA A CADEIA DE FUNÇÕES TODAS AS VARIÁVEIS LOCAIS E PARÂMETROS DE TODA A CADEIA DE FUNÇÕES TODAS AS VARIÁVEIS LOCAIS E PARÂMETROS DE TODA A CADEIA DE FUNÇÕES CHAMADORAS QUE A PRECEDERAM.
CHAMADORAS QUE A PRECEDERAM. CHAMADORAS QUE A PRECEDERAM. CHAMADORAS QUE A PRECEDERAM.
ESSA CAPACIDADE ESSA CAPACIDADE ESSA CAPACIDADE
ESSA CAPACIDADE NÃO É UTILIZADA PELA LINGUAGEM CNÃO É UTILIZADA PELA LINGUAGEM CNÃO É UTILIZADA PELA LINGUAGEM CNÃO É UTILIZADA PELA LINGUAGEM C, NA QUAL OS, NA QUAL OS, NA QUAL OS, NA QUAL OS PARÂMETROS E VARIÁVEIS LOCAIS
PARÂMETROS E VARIÁVEIS LOCAIS PARÂMETROS E VARIÁVEIS LOCAIS
PARÂMETROS E VARIÁVEIS LOCAIS DA FUNÇAO CHAMADORA DA FUNÇAO CHAMADORA DA FUNÇAO CHAMADORA DA FUNÇAO CHAMADORA NÃO SÃO VISÍVEISNÃO SÃO VISÍVEISNÃO SÃO VISÍVEISNÃO SÃO VISÍVEIS A A A A UMA FUNÇÃO CHAMADA. NA LINGUAGEM C UMA FUNÇÃO CHAMADA ACESSA UMA FUNÇÃO CHAMADA. NA LINGUAGEM C UMA FUNÇÃO CHAMADA ACESSA UMA FUNÇÃO CHAMADA. NA LINGUAGEM C UMA FUNÇÃO CHAMADA ACESSA UMA FUNÇÃO CHAMADA. NA LINGUAGEM C UMA FUNÇÃO CHAMADA ACESSA APENAS SEU PRÓPRIO STACK FRAME.
APENAS SEU PRÓPRIO STACK FRAME. APENAS SEU PRÓPRIO STACK FRAME. APENAS SEU PRÓPRIO STACK FRAME. ESSA CAPACIDADE
ESSA CAPACIDADE ESSA CAPACIDADE
ESSA CAPACIDADE NÃO É UTILIZADA PELA LINGUAGEM CNÃO É UTILIZADA PELA LINGUAGEM CNÃO É UTILIZADA PELA LINGUAGEM C, NA QUAL OSNÃO É UTILIZADA PELA LINGUAGEM C, NA QUAL OS, NA QUAL OS, NA QUAL OS PARÂMETROS E VARIÁVEIS LOCAIS
PARÂMETROS E VARIÁVEIS LOCAIS PARÂMETROS E VARIÁVEIS LOCAIS
PARÂMETROS E VARIÁVEIS LOCAIS DA FUNÇAO CHAMADORA DA FUNÇAO CHAMADORA DA FUNÇAO CHAMADORA DA FUNÇAO CHAMADORA NÃO SÃO VISÍVEISNÃO SÃO VISÍVEISNÃO SÃO VISÍVEIS ANÃO SÃO VISÍVEIS A A A UMA FUNÇÃO CHAMADA. NA LINGUAGEM C UMA FUNÇÃO CHAMADA ACESSA UMA FUNÇÃO CHAMADA. NA LINGUAGEM C UMA FUNÇÃO CHAMADA ACESSA UMA FUNÇÃO CHAMADA. NA LINGUAGEM C UMA FUNÇÃO CHAMADA ACESSA UMA FUNÇÃO CHAMADA. NA LINGUAGEM C UMA FUNÇÃO CHAMADA ACESSA APENAS SEU PRÓPRIO STACK FRAME.
APENAS SEU PRÓPRIO STACK FRAME. APENAS SEU PRÓPRIO STACK FRAME. APENAS SEU PRÓPRIO STACK FRAME.
A ARQUITETURA IA-32 PREVÊ AS INSTRUÇÕES A ARQUITETURA IA-32 PREVÊ AS INSTRUÇÕES A ARQUITETURA IA-32 PREVÊ AS INSTRUÇÕES
A ARQUITETURA IA-32 PREVÊ AS INSTRUÇÕES ENTERENTERENTERENTER E E E LEAVE E LEAVELEAVE, QUE PERMITEMLEAVE, QUE PERMITEM, QUE PERMITEM, QUE PERMITEM ESTABELECER
ESTABELECER ESTABELECER
ESTABELECER E E E E DESTRUIRDESTRUIRDESTRUIRDESTRUIR DE FORMA EFICIENTE UM DE FORMA EFICIENTE UM DE FORMA EFICIENTE UM DE FORMA EFICIENTE UM STACKFRAMESTACKFRAMESTACKFRAMESTACKFRAME, INCLUSIVE, INCLUSIVE, INCLUSIVE, INCLUSIVE ARMAZENANDO VALORES DE EBP DE FRAMES ANTERIORES, SE NECESSÁRIO. ARMAZENANDO VALORES DE EBP DE FRAMES ANTERIORES, SE NECESSÁRIO. ARMAZENANDO VALORES DE EBP DE FRAMES ANTERIORES, SE NECESSÁRIO. ARMAZENANDO VALORES DE EBP DE FRAMES ANTERIORES, SE NECESSÁRIO. A ARQUITETURA IA-32 PREVÊ AS INSTRUÇÕES
A ARQUITETURA IA-32 PREVÊ AS INSTRUÇÕES A ARQUITETURA IA-32 PREVÊ AS INSTRUÇÕES
A ARQUITETURA IA-32 PREVÊ AS INSTRUÇÕES ENTERENTERENTERENTER E E E E LEAVELEAVELEAVELEAVE, QUE PERMITEM, QUE PERMITEM, QUE PERMITEM, QUE PERMITEM ESTABELECER
ESTABELECER ESTABELECER
ESTABELECER E E E E DESTRUIRDESTRUIRDESTRUIRDESTRUIR DE FORMA EFICIENTE UM DE FORMA EFICIENTE UM DE FORMA EFICIENTE UM DE FORMA EFICIENTE UM STACKFRAMESTACKFRAMESTACKFRAMESTACKFRAME, INCLUSIVE, INCLUSIVE, INCLUSIVE, INCLUSIVE ARMAZENANDO VALORES DE EBP DE FRAMES ANTERIORES, SE NECESSÁRIO. ARMAZENANDO VALORES DE EBP DE FRAMES ANTERIORES, SE NECESSÁRIO. ARMAZENANDO VALORES DE EBP DE FRAMES ANTERIORES, SE NECESSÁRIO. ARMAZENANDO VALORES DE EBP DE FRAMES ANTERIORES, SE NECESSÁRIO.
STACK FRAMES UTILIZANDO LEAVE E ENTER
STACK FRAMES UTILIZANDO LEAVE E ENTER
int __stdcall MyFunc( int a, int b, int c) {
int var1,var2; var1 = a + b; var2 = c;
return var1 + var2; }
enter 8 , 0 ; prólogo -> salva stack frame anterior, ; estabelece novo stack frame e cria 2 ; variáveis locais
mov eax, dword ptr [ebp+8] ; eax = a add eax, dword ptr [ebp+12]; eax += b mov dword ptr [ebp-4], eax ; var1 = a+b mov eax, dword ptr [ebp+16]; eax = c mov dword ptr [ebp-8], eax ; var2 = c add eax, dword ptr [ebp] ; eax += var1
leave ; epílogo -> destrói as variáveis locais ; restaura stack frame anterior
ret 12 ; retorna e retira 3 parâmetros ; da pilha (3 x 4 = 12 bytes) CARACTERIZA CARACTERIZACARACTERIZA CARACTERIZA CONVENÇÃO CONVENÇÃOCONVENÇÃO CONVENÇÃO DE CHAMADA DE CHAMADADE CHAMADA DE CHAMADA STDCALL STDCALLSTDCALL STDCALL LIMPEZA DA PILHA LIMPEZA DA PILHALIMPEZA DA PILHA LIMPEZA DA PILHA EXECUTADA PELA EXECUTADA PELAEXECUTADA PELA EXECUTADA PELA FUNÇÃO CHAMADA FUNÇÃO CHAMADAFUNÇÃO CHAMADA FUNÇÃO CHAMADA NÍVEL ZERO DE NÍVEL ZERO DE NÍVEL ZERO DE NÍVEL ZERO DE ANINHAMENTO - NÃO ANINHAMENTO - NÃO ANINHAMENTO - NÃO ANINHAMENTO - NÃO COPIA EBP ANTERIORES COPIA EBP ANTERIORES COPIA EBP ANTERIORES COPIA EBP ANTERIORES
ESPAÇO PARA DUAS ESPAÇO PARA DUAS ESPAÇO PARA DUAS ESPAÇO PARA DUAS VARIÁVEIS LOCAIS VARIÁVEIS LOCAIS VARIÁVEIS LOCAIS VARIÁVEIS LOCAIS (8 BYTES) (8 BYTES) (8 BYTES) (8 BYTES)