Więc mam ten kod c:Tajemniczy printf argumentem podczas demontażu c programu
#include <stdio.h>
int main(void)
{
int a;
int b;
int c;
a=b=c=5;
printf("Hi%d%d%dHi",a,b,c);
}
Skompilowałem go na ubuntu z:
gcc program.c -o program -ggdb -m32 -O2
A następnie rozłożyć go:
objdump -M intel program -d
I w głównym printf() zostaje wywołany w ten sposób:
mov DWORD PTR [esp+0x10],0x5
mov DWORD PTR [esp+0xc],0x5
mov DWORD PTR [esp+0x8],0x5
mov DWORD PTR [esp+0x4],0x8048500
mov DWORD PTR [esp],0x1
call 8048330 <[email protected]>
Co Zastanawiam się teraz, co to oznacza:
mov DWORD PTR [esp],0x1
wiem co pierwsze 4 instrukcje mov są za, ale po prostu nie mogę zrozumieć, dlaczego „1” zostanie nasunięty stos. Również ten ruch występuje tylko po włączeniu optymalizacji. Jakieś pomysły?