Другие языки программирования и технологии
Переменные и стек
Купил книгу Архитектура компьютера (Таненбаум). Со стеком запутался. Автор недоработал тему. Непонятно при вызове процедуры все локальные переменные сразу в стек помещаются или только в процессе обращения к ним (когда очередь дойдет). Если кто знает - посоветуйте норм литературу или ресурс, где б стек разбирался подробно (по шагам), в какой момент переменные, аргументы туда попадают, в какой выталкиваются (с командами ассемблера). Желательно чтоб пример был не из 2-х строк кода (как в этой книге), а поболее и с вызовом других процедур с входящими аргументами.
Локальные переменные в стек не помещаются, они там живут.
Обычно в стеке сразу выделяется место для локальных переменных. Но в принципе, компилятор может изменять размер стека, используемого процедурой, по мере необходимости. В некоторых (редких) случаях это может иметь смысл.
Можно написать код на Си (или другом компилируемом языке) и в отладчике посмотреть код на ассемблере. Обычно у компилятора Си есть возможность генерировать файл ассемблера.
Обычно в стеке сразу выделяется место для локальных переменных. Но в принципе, компилятор может изменять размер стека, используемого процедурой, по мере необходимости. В некоторых (редких) случаях это может иметь смысл.
Можно написать код на Си (или другом компилируемом языке) и в отладчике посмотреть код на ассемблере. Обычно у компилятора Си есть возможность генерировать файл ассемблера.
пролог функции
push ebp
mov ebp, esp
Если вы знаете как вызывается функция, то поймете что в стеке будут находится адрес возврата из функции.
примерно как выглядит стек:
... какие то данные которые были в стеке до нас
... стек не выталкивает данные назад при pop, а просто изменяет указатель стека
... сюда будет указывать регистр ebp и esp после пролога, соответственно ebp+8(ebp+адрес возврата) - адрес первого параметра функции (считаю что х86 и тогда адреса 4-х байтные)
... это записанный ebp при прологе
... здесь адрес возврата из функции
... здесь первый параметр функции ebp + 8
... здесь второй параметр если он есть и т. д. ebp+12(думаю параметры тоже 4-х байтные)
Если в такой конструкции отнять от esp нужное число байт, то это и будут локальные параметры, там правда будет "мусор". Поэтому нужно обязательно инициализировать (заполнять начальными значениями). Обращение к локальным параметрам будет через ebp - 0 первая локальная переменная, ebp - 4 вторая и т. д.
... <-сторона уменьшения адреса стек идет в "минус"
...
... <- esp указывает сюда, для следующих вызовов
... <- вторая локальная переменная
... <- первая локальная переменная ebp указывает сюда
... <- предыдущий ebp сохранен при прологе функции
... <-адрес возврата из функции
... <-первый параметр функции (если stdcall функция)
... <-второй параметр функции
... <-локальные переменные предыдущей функции, которая вызвала эту функцию
push ebp
mov ebp, esp
Если вы знаете как вызывается функция, то поймете что в стеке будут находится адрес возврата из функции.
примерно как выглядит стек:
... какие то данные которые были в стеке до нас
... стек не выталкивает данные назад при pop, а просто изменяет указатель стека
... сюда будет указывать регистр ebp и esp после пролога, соответственно ebp+8(ebp+адрес возврата) - адрес первого параметра функции (считаю что х86 и тогда адреса 4-х байтные)
... это записанный ebp при прологе
... здесь адрес возврата из функции
... здесь первый параметр функции ebp + 8
... здесь второй параметр если он есть и т. д. ebp+12(думаю параметры тоже 4-х байтные)
Если в такой конструкции отнять от esp нужное число байт, то это и будут локальные параметры, там правда будет "мусор". Поэтому нужно обязательно инициализировать (заполнять начальными значениями). Обращение к локальным параметрам будет через ebp - 0 первая локальная переменная, ebp - 4 вторая и т. д.
... <-сторона уменьшения адреса стек идет в "минус"
...
... <- esp указывает сюда, для следующих вызовов
... <- вторая локальная переменная
... <- первая локальная переменная ebp указывает сюда
... <- предыдущий ebp сохранен при прологе функции
... <-адрес возврата из функции
... <-первый параметр функции (если stdcall функция)
... <-второй параметр функции
... <-локальные переменные предыдущей функции, которая вызвала эту функцию
Екатерина Sv
Могу немного с числами ошибаться. Вроде ebp - 4 - это адрес первой локальной переменной, а не просто ebp
Екатерина Sv
С адресами могу ошибаться т. к. ebp может указывать на конец стека, а конец стека идет в минус, а не в плюс вот и путаюсь немного. Надеюсь смысл будет понятен, а адреса сами увидите как нибудь. Не хочу дебагер запускать и отслеживать что и куда показывает.
Виктор Чернов
В стеке переменные друг за другом идут. Если сложить нужно 2 переменные из стека которые не сверху, а где то посередине, как процесс пойдет?
а если загуглить стек или что такое стек или как работает стек в с++ и все.
Виктор Чернов
Мне пример нужен, по шагам
Похожие вопросы
- Можно ли сказать, что стек - временный участок памяти, в котором данные хранятся по принципу LIFO(last in first out)?
- Помогите, пожалуйста, найти ошибку в программе сортировки стека (по убыванию ) на Си.
- Вопрос по С++. Стек
- Что такое стек и куча? Они абстрактные понятия, или же конкретные? Очень сильно запутался.
- Помогите, пожалуйста, работа со стеками в среде С++.
- Что такое стек?
- С# - нужно сделать так, чтобы консоль читала слова, как переменные, а не просто слова...
- вопрос про стеки и очереди в паскале/с++
- Нужно в стеке найти первое появление т элемента и поставить его в начало стека. Помогите, пожалуйста!!!
- Вопрос о стеке и куче
а=б+с;
Если а=3 тогда
...
Он пишет: б добавляется в стек, с добавляется в стек, суммирование, те 2переменные выталкиваются и вместо них одна, которая пишется в а, стек снова пустой, затем а пишется в стек ( в стеке одна переменная), 3 пишется в стек...