Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Спасибо
Michail235 вне форума Ответить с цитированием
Старый 09.11.2018, 21:03   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

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

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

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

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

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

Вот что там лежит в районе Вашего кода:
Код:
     +-------------------------+
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, 22:11   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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