Другие языки программирования и технологии

Переменные и стек

Купил книгу Архитектура компьютера (Таненбаум). Со стеком запутался. Автор недоработал тему. Непонятно при вызове процедуры все локальные переменные сразу в стек помещаются или только в процессе обращения к ним (когда очередь дойдет). Если кто знает - посоветуйте норм литературу или ресурс, где б стек разбирался подробно (по шагам), в какой момент переменные, аргументы туда попадают, в какой выталкиваются (с командами ассемблера). Желательно чтоб пример был не из 2-х строк кода (как в этой книге), а поболее и с вызовом других процедур с входящими аргументами.
Виктор Чернов
Виктор Чернов
19 655
Локальные переменные в стек не помещаются, они там живут.
Обычно в стеке сразу выделяется место для локальных переменных. Но в принципе, компилятор может изменять размер стека, используемого процедурой, по мере необходимости. В некоторых (редких) случаях это может иметь смысл.
Можно написать код на Си (или другом компилируемом языке) и в отладчике посмотреть код на ассемблере. Обычно у компилятора Си есть возможность генерировать файл ассемблера.
Владимир Сотников
Владимир Сотников
36 282
Лучший ответ
Виктор Чернов В книге пример
а=б+с;
Если а=3 тогда
...

Он пишет: б добавляется в стек, с добавляется в стек, суммирование, те 2переменные выталкиваются и вместо них одна, которая пишется в а, стек снова пустой, затем а пишется в стек ( в стеке одна переменная), 3 пишется в стек...
Нурлан Досымов Не могли бы вы вот с моим вопросом помочь!? https://otvet.mail.ru/question/208315661
пролог функции
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
Екатерина Sv
15 398
Екатерина Sv Могу немного с числами ошибаться. Вроде ebp - 4 - это адрес первой локальной переменной, а не просто ebp
Екатерина Sv С адресами могу ошибаться т. к. ebp может указывать на конец стека, а конец стека идет в минус, а не в плюс вот и путаюсь немного. Надеюсь смысл будет понятен, а адреса сами увидите как нибудь. Не хочу дебагер запускать и отслеживать что и куда показывает.
Виктор Чернов В стеке переменные друг за другом идут. Если сложить нужно 2 переменные из стека которые не сверху, а где то посередине, как процесс пойдет?
а если загуглить стек или что такое стек или как работает стек в с++ и все.
Виктор Чернов Мне пример нужен, по шагам