Sou iniciante em Assembly, então estou confuso sobre como passar parâmetros em chamadas de função de outra função. Especificamente, tenho um código como este: Assembly:
bar:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $555, -4(%ebp)
movl 12(%ebp), %eax
movl 8(%ebp), %edx
addl %edx, %eax
movl %eax, -8(%ebp)
leave
ret
foo:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $222, 4(%esp)
movl $111, (%esp)
call bar
leave
ret
código C original:
void
bar(int a, int b)
{
int x, y;
x = 555;
y = a+b;
}
void
foo(void) {
bar(111,222);
}
No código Assembly, não entendo por que em foo()
movl $222, 4(%esp)
movl $111, (%esp)
call bar
pode ser lido novamente por bar():
movl 12(%ebp), %eax
movl 8(%ebp), %edx
Tentei analisar mas ainda não entendi se esp - 8 bytes na função foo() pode ser equivalente à posição lida na função bar() esp - 16 bytes? Os números de deslocamento como 12, 8, 4 estão relacionados entre as duas funções? Estou realmente confuso sobre isso. Se alguém me explicar ou me der um exemplo específico para entender esse problema, ficarei muito grato e agradecido. Obrigado
Vamos imaginar alguns valores de amostra e acompanhar o que acontece com ESP/EBP. Além disso, lembre-se de que empurrar algo (incluindo o "
push eip
" escondido dentrocall
) diminuirá a ESP.