Шаг 51 - Адресация к данным в стеке через BP

С общими понятиями о стеке мы познакомились в "Шаг 12 - Что такое стек". Там мы видели, что работать со стеком можно командами push и pop. Но что, если нам нужно будет узнать что же все-таки хранится в стеке не забирая от туда значения? Из этого есть выход и здесь нам может помочь регистр bp. Вообще bp можно использовать свободно для многих целей, мы с Вами посмотрим пример на основе стека. Итак, код:

MODEL SMALL
STACK 256
CODESEG
Start:
	
	mov ax,@data 		; установка в ds адpеса
	mov ds,ax 		; сегмента данных
	mov ax,'F'
	push ax
	mov ax,'I'	
	push ax
	mov ax,'R'
	push ax
	mov ax,'S'	
	push ax
	mov ax,'T'	
	push ax
	mov cx,5			; счетчик
	mov bp,sp			; настраиваем bp

WriteLoop:
	mov dx,[bp]		; берем значение
	Call WriteChar
		add bp,2
loop WriteLoop

Exit:
	CALL ExitProgramm 

INCLUDE  function.asm 

End Start

Первыми командами мы помещаем данные в стек. Можно посмотреть, что там адресовалиcь ss:sp.

Кто последним пришел, тот в стеке первый. Последняя команда на данный момент.

mov ax,'T'	
push ax

Вот эта буква как раз в самом верху сейчас. Но в самом верху стека или внизу памяти. SP указывает на низ в памяти. Соответственно пройдя вверх можно исследовать, что в стеке. Вот для этого мы регистр BP и настраиваем.

mov bp,sp

А дальше мы начинаем в цикле выбирать значения по адресу bp постоянно его увеличивая на 2. Почему на 2? Вы сохраняли регистр AX он два байта, а нам нужен только один байт. Вот мы его и берем. Смотрим результат работы программы.

Все нормально.


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