Я пытался понять разобранный код следующей функции.Демонтаж функции C
void func(char *string) {
printf("the string is %s\n",string);
}
Демонтированный код приведен ниже.
1) 0x080483e4 <+0>: push %ebp
2) 0x080483e5 <+1>: mov %esp,%ebp
3) 0x080483e7 <+3>: sub $0x18,%esp
4) 0x080483ea <+6>: mov $0x80484f0,%eax
5) 0x080483ef <+11>: mov 0x8(%ebp),%edx
6) 0x080483f2 <+14>: mov %edx,0x4(%esp)
7) 0x080483f6 <+18>: mov %eax,(%esp)
8) 0x080483f9 <+21>: call 0x8048300 <[email protected]>
Может ли кто-нибудь сказать мне, что означает линии 4-7 (не буквальное объяснение). Также почему 24 байта выделены в стеке в строке 3?
Вы знакомы с тем, как работает стек, например. при использовании 'push' /' pop'? – DCoder
Я думаю, что знаю, что – user146297
Тогда эти строки довольно просты - вместо того, чтобы «нажимать» значение на стек, GCC вручную переместил указатель стека и переместил это значение в новую вершину стека. Посмотрите раздел «Аргументы» [этой статьи] (http://codearcana.com/posts/2013/05/21/a-brief-introduction-to-x86-calling-conventions.html), он объясняет это в некоторые подробности.Что касается «почему 24 байта стека», это внутреннее решение компилятора, которое может быть связано с * стеком выравнивания *, * стека канарейки * или просто случайным решением. – DCoder