Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 09.11.2018, 21:21   #1
Michail235
Пользователь
 
Регистрация: 11.10.2010
Сообщений: 10
Репутация: 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. И зачем?

Спасибо
Michail235 вне форума   Ответить с цитированием
Старый 09.11.2018, 22:03   #2
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,398
Репутация: 2468

icq: 438888048
По умолчанию

1. Наоборот на стеке, раз он растет вниз.
2 и 3. По соглашению о вызове на стеке будут лежать аргументы вызова функции. Почему именно с единицей, это уже семантика.
__________________
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума   Ответить с цитированием
Старый 09.11.2018, 22:42   #3
Michail235
Пользователь
 
Регистрация: 11.10.2010
Сообщений: 10
Репутация: 10
По умолчанию

По первому вопросу не согласен. Пусть esp = 10. После 1-й строки ebp=10. Стек, таким образом растет от 10 до 0. А ebp+8 = 18 - это вне стека
Michail235 вне форума   Ответить с цитированием
Старый 09.11.2018, 22:50   #4
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,147
Репутация: 840
По умолчанию

Цитата:
Сообщение от Michail235 Посмотреть сообщение
Что это за 1, с которой сравнивается содержимое ebp+8?
Для main там будет количество аргументов лежать.
Проверка, есть ли аргументы (кроме имени)
Black Fregat вне форума   Ответить с цитированием
Старый 09.11.2018, 23:04   #5
Michail235
Пользователь
 
Регистрация: 11.10.2010
Сообщений: 10
Репутация: 10
По умолчанию

Спасибо. Очень похоже на правду. Значит ebp+8 указывает на строку аргументов. И в самом начале стека (или на верхней границе стека) лежит строка аргументов. Надо будет отладчиком посмотреть.
Michail235 вне форума   Ответить с цитированием
Старый 09.11.2018, 23:10   #6
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,147
Репутация: 840
По умолчанию

Вы который раз говорите про начло стека, границу стека..
До границы стека очень и очень далеко.
Стек ведь не возникакет в момент входа в процедуру.

Вот что там лежит в районе Вашего кода:
Код:

     +-------------------------+
bp+12| Аргумент 2              |  char* argv[]
     +-------------------------+
bp+8 | Аргумент 1              |  int argc 
     +-------------------------+
bp+4 | Адрес возврата          |
     +-------------------------+ <-- SP на момент входа
bp+0 | Сохранённый BP          | 
     +-------------------------+ <-- BP (адрес фрейма)
bp-4 | Локальная переменная 1  |
     +-------------------------+
bp-8 | Локальная переменная 2  |
     +-------------------------+ <-- SP на конец пролога
     | Стек Функции            |
     | ...                     |
     | ...                     |

Black Fregat вне форума   Ответить с цитированием
Старый 09.11.2018, 23:11   #7
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,398
Репутация: 2468

icq: 438888048
По умолчанию

Цитата:
Сообщение от Michail235 Посмотреть сообщение
По первому вопросу не согласен.
Пусть esp был 0x1000. Сделали пуш на стек 32битного числа. Адрес стал 0xFFC. Там где адрес меньше, еще ничего нет, а там где больше, там начало стека.
__________________
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума   Ответить с цитированием
Старый 10.11.2018, 21:10   #8
Michail235
Пользователь
 
Регистрация: 11.10.2010
Сообщений: 10
Репутация: 10
По умолчанию

2Black Fregat
Огромное спасибо. Если не сложно, откуда сия схема
Michail235 вне форума   Ответить с цитированием
Старый 10.11.2018, 21:29   #9
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,618
Репутация: 1708
По умолчанию

От сюда:
http://www.sco.com/developers/devspecs/abi386-4.pdf
https://en.wikipedia.org/wiki/Execut...inkable_Format
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума   Ответить с цитированием
Старый 10.11.2018, 22:32   #10
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,147
Репутация: 840
По умолчанию

Цитата:
Сообщение от Michail235 Посмотреть сообщение
Если не сложно, откуда сия схема
Авторский продукт! Эксклюзивно ради Вас! Нарисовал из головы..
Black Fregat вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структура стека Daryan Visual C++ 0 12.05.2016 16: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


10:29.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru