Как работает стек
Конспект видео: https://www.youtube.com/watch?v=MXoMuymbfo8&list=PLIJLLSrXDPojDGKW0WZ7sU0eO3nyn0oDc&index=3&pp=iAQB
Что такое стек
• Вся ОП делиться на стек и кучу
• Стек - отведен для хранения временных данных
• Работает по LIFO
Рост в обратную сторону
• Вся остальная память это куча - в ней остальные работающие программы и ОС
• Куча растёт от младших адресов к старшим.
• Стек начинается где-то в старших и заполняется по направлению к начальным адресам
• Это потому что за стеком идёт куча и чтобы он не затирал данные в случае переполнения
Указатели
• Каждый элемент стека занимает 1 машинное слово
• Регистр SP (stak pointer) - хранит адрес последнего добавленного элемента
• Регистр BP (base pointer) - начало стека (подножие)
Функции
• У каждой функции есть свой адрес начала в памяти
• Указатель IP прыгает по адресам и после завершения функции благодаря стеку возвращается в предыдущую функции
Команды перехода
• jmp - прыгает на участок кода по адресу
• call - перед прыжком записывает адрес возврата в стек
• ret - возвращается на записанный адрес возврата
Фрейм стека
• Функция в стеке занимает фрейм который содержит её локальные Переменные
• Формирование и удаление фреймов реализуется в прологе и эпилоге функции
• BP - указывает на начало фрейма предыдущей функции
• Пролог - инструкции в начале функции:
1. Сохраняем адрес BP, чтобы вернуться в пред функцию
2. Перемещаем BP на вверх стека, чтобы начать формировать фрейм
3. Далее фрейм увеличивается по мере добавления локальных переменных
• Эпилог функции:
1. Возвращаем sp к BP
2. Sp указывает на старый адрес BP, извлекаем и устанавливаем его для bp
3. Командой ret, перемещаем sp на адрес возврата
Передача параметров в функцию
• Аргументы в стек заносятся в обратном порядке
• Для обращения к ним отсчёт идёт от BP [BP + размер ячейки стека * (1 + n аргумента)]