Шаг 12 - Что такое стек

Стек - это специальная область памяти. Адресацией в этой области управляет регистр 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:

12_1.gif (1131 b)

Дойдем до выполнения push:

12_2.gif (2537 b)

После его выполнения указатель стека изменится. А теперь дойдем до pop перед ее выполнением.

12_3.gif (4919 b)

Указатель стека не изменился. В регистре AX находится какое-то значение. Выполним команду:

12_4.gif (2380 b)

Указатель стека вернулся на исходную позицию, а в регистре появилось наше сохраненное значение.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 28.11.2001