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

Resource Limit Is Reached

The website is temporarily unable to service your request as it exceeded resource limit. Please try again later.

ГЛАВА 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
    <


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


    508 Resource Limit Is Reached

    Resource Limit Is Reached

    The website is temporarily unable to service your request as it exceeded resource limit. Please try again later.