06. Стек. Назначение, примеры использования. - mRrvz/bmstu-asm GitHub Wiki

Стек. Назначение, примеры использования.

Стек работает по правилу LIFO / FILO (последним пришёл, последним вышел)

Сегмент стека — область памяти программы, используемая её подпрограммами, а также (вынужденно) обработчиками прерываний.

Используется для временного хранения переменных, передачи параметров для подпрограм, адрес возврата при вызове процедур и прерываний.

Регистр SP — указывает на вершину стека

В x86 стек "растёт вниз", в сторону уменьшения адресов (от максимально возможно адреса). При запуске программы SP указывает на конец сегмента.

BP (Base Pointer)

Используется в подпрограмме для сохранения "начального" значения SP.

Так же, используется для адресации параметров и локальных переменых.

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

стек

Команды работы со стеком

PUSH <источник> — поместить данные в стек. Уменьшает SP на размер источника и записывает значение по адресу SS:SP.

POP <приемник> — считать данные из стека. Считывает значение с адреса SS:SP и увеличивает SP.

PUSHA — поместить в стек регистры AX, CX, DX, BX, SP, BP, SI, DI. (регистры общего назначения + SP + BP)

POPA — загрузить регистры из стека (SP игнорируется)

СALL и RET

CALL <операнд> — передает управление на адрес <операнд>

Сохраняет адрес следующей команды в стеке (уменьшает SP и записывает по его адресу IP либо CS:IP, в зависимости от размера аргумента)

RET <число> — загружает из стека адерс возврата, увеличивая SP.

Если указать операнд, то можно очистить стек для очистки стека от параметров (<число> будет прибавлено к SP)

Примеры использования

1

2

3

⚠️ **GitHub.com Fallback** ⚠️