-
Notifications
You must be signed in to change notification settings - Fork 0
21. Стек. Аппаратная поддержка вызова подпрограмм.
SP – Stack Pointer (меняется автоматически процессором, но руками его тоже можно поменять)
BP – Base Pointer (вспомогательный регистр, используется программистом или компилятором)
Стек – структура данных, которая работает по принципу первым пришел, последним ушел (LIFO / FILO).
Сегмент стека – область памяти программы, используемая ее подпрограммами, а также (вынужденно) обработчиками прерываний.
SP – указатель на вершину стека
❗️ В х86 стек растет вниз, в сторону уменьшения адресов. При запуске программы SP указывает на конец сегмента.
❔ Почему так сделали
Чтобы проще было отследить переполнение стека
(если адрес дошел до 0, значит мы заполнили все) =>
экономия регистра (не используем доп регистр для хранения размера стека).
PUSH <и> ; поместить данные в стек.
; Уменьшает SP на размер источника и записывает значение по адресу SS:SP
POP <п> ; считать данные из стека.
; Считывает значения адреса SS:SP и увеличивает SP на величину приемника.
PUSHA ; поместить в стек регистры AX, CX, DX, BX, SP, BP, SI, DI.
POPA ; загрузить регистры из стека (SP игнорируется)
PUSHF ; поместить в стек содержимое регистра флагов
POPF ; загрузить регистр флагов из стека.
Используется для:
- сохранения “начального” значения SP
типа чтобы в подпрограмме можно было писать что-то в стек, а по возвращении можно было вернуть состояние стека
- адресации параметров
то, что положила в стек вызывающая программа
- адресации локальных переменных
глобальные переменные обычно валяются в сегменте данных, локальные же там хранить нельзя, так как в этом случае при каждом вызове они будут перезатираться
При вызове подпрограммы параметры кладут на стек, а в BP кладут текущее значение SP. Если программа использует стек для хранения локальных переменных, SP изменится и таким образом можно будет считывать переменные напрямую из стека (их смещения запишутся как BP + номер параметра)
Соглашения о вызовах – как передавать параметры (стек или регистры), как возвращать результат (по си возврат идет через ax), способы освобождения памяти от параметров.
Стековый кадр – механизм передачи аргументов и выделения временной памяти с использованием аппаратного стека. Содержит информацию о состоянии подпрограммы.
Включает в себя
- параметры
- адрес возврата (обязательно)
- локальные переменные