2.1.3. Стек

Стек - организованный специальным образом участок памяти, который ис­пользуется для временного хранения переменных, передачи параметров вызыва­емым подпрограммам и сохранения адреса возврата при вызове процедур и пре­рываний. Легче всего представить стек в виде стопки листов бумаги (это одно из значений слова «stack» в английском языке) - вы можете класть и забирать листы только с вершины стопки. Поэтому, если записать в стек числа 1, 2, 3, то при чте­нии они окажутся в обратном порядке - 3, 2, 1. Стек располагается в сегменте па­мяти, описываемом регистром SS, и текущее смещение вершины стека отраженот

в регистре ESP, причем во время записи значение этого смещения то есть он «растет вниз» от максимально возможного адреса (см. рис. 4). Такое расположение стека «вверх ногами» может быть необходимо, к примеру, в бес­сегментной модели памяти, когда все сегменты, включая сегменты стека и кода, занимают одну и ту же область - память целиком. Тогда программа исполняет­ся в нижней области памяти, в области малых адресов, и EIP растет, а стек распо­лагается в верхней области памяти, и ESP уменьшается.

При вызове подпрограммы параметры в большинстве случаев помещают в стек, а в ЕВР записывают текущее значение ESP. Если подпрограмма использует стек для хранения локальных переменных, ESP изменится, но ЕВР можно будет ис­пользовать для того, чтобы считывать Значения параметров напрямую из стека (их смещения запишутся как ЕВР + номер параметра). Более подробно вызовы подпрограмм и все возможные способы передачи параметров рассмотрены в раз­деле 5.2.1

OFFFFFFFCh 0FFFFFFF8h 0FFFFFFF4h OFFFFFFFOh OFFFFFFECh 0FFFFFFE8h 0FFFFFFE4h

Дно стека

Параметры

EBP =OFFFFFFFOh

Локальные переменные

<- ESP=0FFFFFE4h

4'

Рис. 4. Стек