Вы здесь: HomeСтек

Стек

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

Что такое стек и как он работает?

Давайте разберемся, как работает стек. Все мы знаем, что такое очередь. Приходит первый клиент, пока его обслуживают, подходят еще два клиента. Когда первый клиент обслужен, начнут обслуживать второго клиента, затем третьего — и так далее. Принцип заключается в том, что первым будет обслужен тот, кто пришел первым. Такой тип очереди называется FIFO (First In — First Out) — первым пришел, первым вышел.

Стек FIFO . Ассемблер.

Существует и другой тип очереди — LIFO (Last In — First Out) — последним пришел, первым вышел. Понимаю, что с точки зрения обычного человека это какая-то неправильная очередь, но в жизни мы сталкиваемся с ней не реже, чем с первой. Например, мы собираемся куда-то поехать и укладываем вещи. Когда мы откроем сумку, вверху окажутся вещи, которые мы положили  ­последними.

Стек  LIFO. Ассемблер.

Стек в x86 работает по принципу LIFO. Данные, помещенные в стек последними, будут первыми «вытолкнуты» из стека.

В PC-совместимых компьютерах нет аппаратного стека, поэтому данные стека хранятся в памяти. Вершина стека представлена парой SS:SP (SS:ESP) — сегмент стека (Stack Segment) и указатель вершины стека (Stack Pointer). Стек растет в памяти «вниз», то есть новая порция данных записывается по меньшему адресу. Впрочем, точный адрес данных внутри стека не имеет для нас значения, потому что любая операция над стеком имеет дело с его вершиной, на которую всегда указывает регистр SP (ESP). Стек может содержать 16- или 32-битные данные.

 Микропроцессор имеет две команды для работы со стеком — PUSH и POP.