В попытке понять, что происходит ниже, я делаю небольшие программы на C, а затем обращаюсь к нему и пытаюсь понять его вывод objdump.
Программа на C:
#include <stdio.h>
int function(int a, int b, int c) {
printf("%d, %d, %d\n", a,b,c);
}
int main() {
int a;
int *ptr;
asm("nop");
function(1,2,3);
}
Вывод objdump для функции дает мне следующее.
080483a4 <function>:
80483a4: 55 push ebp
80483a5: 89 e5 mov ebp,esp
80483a7: 83 ec 08 sub esp,0x8
80483aa: ff 75 10 push DWORD PTR [ebp+16]
80483ad: ff 75 0c push DWORD PTR [ebp+12]
80483b0: ff 75 08 push DWORD PTR [ebp+8]
80483b3: 68 04 85 04 08 push 0x8048504
80483b8: e8 fb fe ff ff call 80482b8 <printf@plt>
80483bd: 83 c4 10 add esp,0x10
80483c0: c9 leave
Обратите внимание, что перед вызовом printf три DWORD со смещениями 8,16,12 (они должны быть аргументами function
в обратном порядке) помещаются в стек. Позже вводится шестнадцатеричный адрес, который должен быть адресом строки формата.
My doubt is
- Вместо того, чтобы помещать 3 DWORDS и спецификатор формата непосредственно в стек, я ожидал увидеть, что esp будет вручную уменьшен, а после этого значения будут помещены в стек. Как можно объяснить это поведение?