С общими понятиями о стеке мы познакомились в "Шаг 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 он два байта, а нам нужен только один байт. Вот мы его и берем. Смотрим результат работы программы.
Все нормально.