Напомним, что стеком называется область памяти, предназначенная для временного хранения данных. Для этой области в программе выделяется сегмент объемом £ 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 новое слово и, значит, воздействует на все флаги.