Стек - это специальная область памяти. Адресацией в этой области управляет регистр SP или указатель стека. Используется эта память в основном для временного хранения содержимого регистров. Именно временного. Самое главное понять, как стек работает. А работает он по принципу первый пришел последний ушел. Давайте представим. Я ложу книгу на стол. Потом сверху еще одну книгу. Первая книга внизу. Что бы извлечь ее мне сначала нужно снять верхнею и только после этого я получу доступ к первой. Но можно просто в жизни ее выдернуть. Можно. Представьте себе кучу книг до потолка. Попробуйте выдернуть нижнею. Есть огромный шанс что Вас этими книгами и завалит. То же будет и с Вашей программой. Для работы со стеком используются команды. Для того, чтобы положить в стек:
Push регистр
Для извлечения:
Pop регистр
Изменим пример из шага "Шаг 3 - Программа HelloWord". Вот код:
MODEL TINY STACK 256 DATASEG Hellostr DB 'Hello First Step Site ' CODESEG start: mov ax,@data mov ds,ax mov ah,04Ch mov al,1h push ax mov bx,1 mov cx,21 mov dx,offset Hellostr mov ah,40h int 21h pop ax int 21h end start
Что вы должны были заметить? Что настройку регистра AX я сделал в самом начале программы. И сохранил в стек.
push ax
Потом этот регистр мы изменяем для вызова функции строки:
mov ah,40h int 21h
И в самом конце мы с Вами восстанавливаем содержимое регистра AX из стека:
pop ax
Так, нам пора в отладчик. В самом начале указатель стека 100:
Дойдем до выполнения push:
После его выполнения указатель стека изменится. А теперь дойдем до pop перед ее выполнением.
Указатель стека не изменился. В регистре AX находится какое-то значение. Выполним команду:
Указатель стека вернулся на исходную позицию, а в регистре появилось наше сохраненное значение.