Comportamento de ebp e esp em pilhas usando função com parâmetro
Eu quero aprender mais sobre pilha. Especialmente, o que acontece quando uma função com parâmetro é chamada. Para isso, escrevo o seguinte código:
#include <stdio.h>
int sum(int d, int e, int f){
int result = d + e + f;
return result;
}
int main(void){
int a = 5;
int b = 4;
int c = 2;
int erg = sum(a,b,c);
printf("Result is: %d", erg);
}
e recebo o seguinte Código de Montagem (adicionarei apenas a parte domain
função, porque primeiro eu quero entender esta seção):
push ebp,
mov ebp, esp
and esp, -16
sub esp, 32
mov DWORD PTR[esp+28], 5
mov DWORD PTR[esp+24], 4
mov DWORD PTR[esp+20], 2
mov eax, DWORD PTR[esp+20]
mov DWORD PTR[esp+8], eax
mov eax, DWORD PTR[esp+24]
mov DWORTD PTR[esp+4], eax
mov eax, DWORD PTR[esp+28]
mov DWORD PTR[esp], eax
call sum
........
........
Então, para esta parte eu desenho um pequeno esboço para mim mesmo. Por favor, dê uma olhada :) Minha pergunta: Onde está nesse ponto o meuebp
? Por causa da linha 2 do meu código assembler, ele deve estar no mesmo lugar como[esp]
, certo ?
Agora, a parte da função soma que segue a minha segunda pergunta.
então aqui está o código de montagem disso:
push ebp
mov ebp, esp
sub esp, 16
mov eax, DWORD PTR[ebp+12]
mov edx, DWORD PTR[ebp+8]
mov edx, eax
------------
então, eu aprendi que podemos encontrar nossos parâmetros sempre em[eb+12]
e[ebp+8]
. (Eu pulei o terceiro parâmetro porque eu quero mantê-lo simples) Então, a minha pergunta é agora: Se eu assumir queesp
=ebp
e eu olho para o meu esboço, então eu vejo que não há nada[esp+12]
ou agora[ebp+12]
. Mas, no entanto, é usado. Como posso imaginar isso?
Alguém pode me ajudar? Li muitos jornais, mas ninguém parece esboçar essas coisas. Por causa disso, é muito difícil entender isso.
Obrigado!
Aqui está meu esboço: