|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
09.11.2018, 20:21 | #1 |
Пользователь
Регистрация: 11.10.2010
Сообщений: 10
|
Структура кадра стека
Пробую разобраться с созданием стекового кадра.
Фрагмент дизассемблированной программы (самое начало): (gdb) disass main Dump of assembler code for function main: 0x08048474 <main+0>: push ebp 0x08048475 <main+1>: mov ebp,esp 0x08048477 <main+3>: sub esp,0x8 0x0804847a <main+6>: and esp,0xfffffff0 0x0804847d <main+9>: mov eax,0x0 0x08048482 <main+14>: sub esp,eax 0x08048484 <main+16>: cmp DWORD PTR [ebp+8],0x1 0x08048488 <main+20>: jg 0x80484ab <main+55> .... Интересует 6 строка. Несколько вопросов: 1. ebp в соответствии с 1-ой строкой равен esp (в начале работы программы), т.е. это почти адрес стекового кадра main. Тогда ebp+8 - это адрес где-то вне стека, ведь стек "растет" по уменьшению адресов. А что может быть вне стека? 2. Что это за 1, с которой сравнивается содержимое ebp+8? 3. И зачем? Спасибо |
09.11.2018, 21:03 | #2 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,291
|
1. Наоборот на стеке, раз он растет вниз.
2 и 3. По соглашению о вызове на стеке будут лежать аргументы вызова функции. Почему именно с единицей, это уже семантика.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
09.11.2018, 21:42 | #3 |
Пользователь
Регистрация: 11.10.2010
Сообщений: 10
|
По первому вопросу не согласен. Пусть esp = 10. После 1-й строки ebp=10. Стек, таким образом растет от 10 до 0. А ebp+8 = 18 - это вне стека
|
09.11.2018, 21:50 | #4 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
|
09.11.2018, 22:04 | #5 |
Пользователь
Регистрация: 11.10.2010
Сообщений: 10
|
Спасибо. Очень похоже на правду. Значит ebp+8 указывает на строку аргументов. И в самом начале стека (или на верхней границе стека) лежит строка аргументов. Надо будет отладчиком посмотреть.
|
09.11.2018, 22:10 | #6 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
Вы который раз говорите про начло стека, границу стека..
До границы стека очень и очень далеко. Стек ведь не возникакет в момент входа в процедуру. Вот что там лежит в районе Вашего кода: Код:
|
09.11.2018, 22:11 | #7 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,291
|
Пусть esp был 0x1000. Сделали пуш на стек 32битного числа. Адрес стал 0xFFC. Там где адрес меньше, еще ничего нет, а там где больше, там начало стека.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
10.11.2018, 20:10 | #8 |
Пользователь
Регистрация: 11.10.2010
Сообщений: 10
|
2Black Fregat
Огромное спасибо. Если не сложно, откуда сия схема |
10.11.2018, 20:29 | #9 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
От сюда:
http://www.sco.com/developers/devspecs/abi386-4.pdf https://en.wikipedia.org/wiki/Execut...inkable_Format
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
10.11.2018, 21:32 | #10 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Структура стека | Daryan | Visual C++ | 0 | 12.05.2016 15:59 |
Длина кадра сети | XemyL | Помощь студентам | 0 | 05.11.2013 11:17 |
Вставка кадра... | Кулибаба Петро | Microsoft Office Word | 1 | 31.12.2012 18:03 |
Эффект 25 кадра | ZvEr_HaCkEr | Свободное общение | 16 | 05.08.2010 18:56 |
Формирование кадра | IzhAtomic | Помощь студентам | 0 | 26.04.2009 18:44 |