Computer Science
May 28

Как работает стек

Конспект видео: 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 аргумента)]

Способы передачи параметров

• Через стек, регистры, глобальные Переменные