3.6. Работа со стеком

Напомним, что стеком называется область памяти, предназначенная для временного хранения данных. Для этой области в программе выделяется сегмент объемом £ 64 Кбайт, который называется сегментом стека. Для работы со стеком предназначены следующие регистры:

· ss – сегментный регистр стека

· sp – регистр указателя базы.

Доступ к содержимому стека осуществляется также с помощью регистра BP.

Команды работы со стеком организованы в соответствии с принципом LIFO (последним пришел – первым ушел) :

push   операнд     ; запись операнда в стек

pop    операнд     ; чтение операнда из стека

Команда push  сначала вычитает из регистра sp число 2, уменьшая тем самым адрес начала стека на 2, а затем записывает операнд в начало стека. Команда pop, напротив, сначала считывает слово из начала стека и записывает его в операнд, а затем увеличивает значение регистра SP на 2.

Если операндом является двойное слово, то команда push вычитает из SP число 4, а команда pop увеличивает sp на 4.

Пример. Команды

push   100   ; записать число 100 в стек

pop    bx    ; извлечь из стека

установят bx = 100.

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

      pusha       ; сохранить в стек AX, CX, DX, BX, SP, BP, SI, DI

Регистры сохраняются в стек в указанном порядке.

Восстановление:

      popa

Слова, выбираемые из стека, размещаются в регистрах: DI, SI, BP, *, BX, DX, CX, AX, где символом * обозначено слово, которое игнорируется вместо того, чтобы быть помещенным в регистр SP.

Команды работы со стеком можно использовать для установки флагов:

pushf  ; запомнить регистр FL в стек

popf   ; слово извлекается из стека и записывается в FL

Команда pushf не изменяет разряды регистр FL, а popf, напротив, записывает в  FL новое слово и, значит, воздействует на все флаги.