21. Стек. Аппаратная поддержка вызова подпрограмм. - Tulenenok/_Assembler Wiki

Введение

image

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         ; загрузить регистр флагов из стека.

Base Pointer

Используется для:

  • сохранения “начального” значения SP

    типа чтобы в подпрограмме можно было писать что-то в стек, а по возвращении можно было вернуть состояние стека

  • адресации параметров

    то, что положила в стек вызывающая программа

  • адресации локальных переменных

    глобальные переменные обычно валяются в сегменте данных, локальные же там хранить нельзя, так как в этом случае при каждом вызове они будут перезатираться

При вызове подпрограммы параметры кладут на стек, а в BP кладут текущее значение SP. Если программа использует стек для хранения локальных переменных, SP изменится и таким образом можно будет считывать переменные напрямую из стека (их смещения запишутся как BP + номер параметра)

image

ДОП

Соглашения о вызовах – как передавать параметры (стек или регистры), как возвращать результат (по си возврат идет через ax), способы освобождения памяти от параметров.

Стековый кадр – механизм передачи аргументов и выделения временной памяти с использованием аппаратного стека. Содержит информацию о состоянии подпрограммы.

Включает в себя

  • параметры
  • адрес возврата (обязательно)
  • локальные переменные

Помним про CALL(18) и RET (19)