03. Регистры работы со стеком. - mRrvz/bmstu-asm GitHub Wiki

Стек

Стек - структура данных, работающая по принципу LIFO (last in, first out) - последним пришёл, первым вышел.

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

SP - указатель на вершину стека, BP - указатель на начало стека. BP используется в подпрограмме для сохранения "начального" значения SP, адресации параметров и локальных переменных.

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

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

PUSH <источник>

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

POP <приемник>

Считывает данные из стека. Считывает значение с адреса SS:SP и увеличивает SP.

PUSHA

Помещает в стек регистры AX, CX, DX, BX, SP, BP, SI, DI.

POPA

Загружает регистры из стека (SP игнорируется).

Вызов процедуры и возврат из процедуры

CALL <операнд>

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

RET/RETN/RETF <число>

Загружает из стека адрес возврата, увеличивает SP. Если указан операнд, его значение будет дополнительно прибавлено к SP для очистки стека от параметров.

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