Ассемблер Это просто! Учимся программировать


ГЛАВА 06


  • Итак, что же такое стек и для чего он нужен?

    Стек - это специально отведенная область памяти для хранения промежуточных данных.

    Давайте немного договоримся об определениях.

    Пусть будет так, что сегмент "растет" сверху вниз: 0000 0001 0002 ... FFFE FFFF

    Т.е. мы как бы погружаемся под землю. Таким образом (сверху вниз) выполняется программа (если, конечно, не встречаются инструкции (команды) типа jmp, call и т.п.).

    Стек же наоборот пополняется снизу вверх. Вершина стека - 0FFFFh, а низ (дно) - 0000h.

    Когда мы вызываем какую-нибудь подпрограмму командой call, процессор кладет в стек адрес следующей за командой call инструкции. Следить за стеком позволяет пара регистров SS:SP. Многие уже, наверное, заметили, что при запуске какой-нибудь com-программы регистр SP равен 0FFFEh, а сегментный регистр SS, как уже упоминалось в предыдущих главах, равен нашему единственному сегменту (CSEG) (как и CS, DS, ES).

    Теперь вам необходимо вооружиться отладчиком. Давайте рассмотрим вышесказанное на примере:

    Напечатайте такую программу в редакторе (обязательно!):

    CSEG segment assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG org 100h begin: call Our_proc int 20h Our_proc proc ret Our_proc endp CSEG ends end Begin

    Ничего сложного... Запускаем отладчик.

    Итак, смотрим на пару регистров SS:SP. SS=CS=DS=ES (это понятно). SP=0FFFEh (т.е. указывает на вершину стека).

    Теперь заходим в процедуру. Для CV нажимаем F8, для AFD F1.

    Опа! SP изменился. Он уменьшился на 2. Компьютер поместил в стек адрес возврата из процедуры (на инструкцию ) Проще говоря, call перешел на метку Our_proc, поместив в стек адрес возврата из этой подпрограммы.

    Нажимаем еще раз F8/F1. Что получилось? SP опять изменился! Но теперь он увеличился на 2 (стал равным 0FFFEh). Т.е. команда ret взяла из стека адрес возврата и перешла по нему. Как раз на int 20h.

    В данном случае говорят, что мы выравнили стек. Он был изначально равен 0FFFEh и остался равен перед выходом 0FFFEh.

    Вот один из способов использования стека. Но на этом мы не остановимся и рассмотрим несколько операторов, которые позволяют работать со стеком.

    Оператор Перевод Применение Процессор
    PUSH приемник push - втолкнуть Поместить в стек число 8086
    <


    Начало  Назад  Вперед



    Книжный магазин