Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура ВС-пособие.docx
Скачиваний:
8
Добавлен:
01.05.2025
Размер:
728.99 Кб
Скачать

Организация циклов

Цикл представляет собой важную алгоритмическую структуру, без использования которой не обходится, наверное, ни одна программа. Организовать циклическое выполнение некоторого участка программы можно, к примеру, используя команды условной передачи управления или команду безусловного перехода jmp. При такой организации цикла все операции по его организации выполняются “вручную”. Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики микропроцессора ввели в систему команд группу из трех команд, облегчающую программирование циклов. Дадим краткую характеристику этим командам: 

LOOP метка_перехода - повторить цикл. Работа команды заключается в выполнении следующих действий:

  • декремента регистра ecx/cx;

  • сравнения регистра ecx/cx с нулем:

если (ecx/cx) > 0, то управление передается на метку перехода;

если (ecx/cx) = 0, то управление передается на следующую после loop команду.

LOOPE/LOOPZ метка_перехода (Loop till cx <> 0 or Zero Flag = 0) - повторить цикл, пока cx <> 0 или zf = 0.

Команды loope и loopz — абсолютные синонимы, поэтому используйте ту команду, которая вам больше нравиться. Работа команд заключается в выполнении следующих действий:

  • декремента регистра ecx/cx;

  • сравнения регистра ecx/cx с нулем;

  • анализа состояния флага нуля zf:

если (ecx/cx) > 0 и zf = 1, управление передается на метку перехода;

если (ecx/cx) = 0 или zf = 0, управление передается на следующую после loop команду.

LOOPNE/LOOPNZ метка_перехода (Loop till cx <> 0 or Not Zero flag=0) - повторить цикл пока cx <> 0 или zf = 1.

Команды loopne и loopnz также абсолютные синонимы. Работа команд заключается в выполнении следующих действий:

  • декремента регистра ecx/cx;

  • сравнения регистра ecx/cx с нулем;

  • анализа состояния флага нуля zf:

    • если (ecx/cx) > 0 и zf = 0, управление передается на метку перехода;

    • если (ecx/cx)=0 или zf=1, управление передается на следующую после loop команду.

Команды loope/loopz и loopne/loopnz по принципу своей работы являются взаимообратными. Они расширяют действие команды loop тем, что дополнительно анализируют флаг zf, что дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора.

Общая особенность команд цикла в том, что они используют РОН СХ как счетчик числа циклов, поэтому при их использовании не забудьте до метки_перехода послать в этот регистр нужное число!

Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуют только короткие переходы (от –128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду jmp, поэтому постарайтесь освоить оба способа организации циклов. 

Лекция 15. Стек

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

Перечислим еще некоторые особенности работы со стеком:

  • запись и чтение данных в стеке осуществляется в соответствии с принципом LIFO (Last In First Out — “последним пришел, первым ушел”);

  • по мере записи данных в стек последний растет в сторону младших адресов. Эта особенность заложена в алгоритм команд работы со стеком;

  • при использовании регистров esp/sp и ebp/bp для адресации памяти ассемблер автоматически считает, что содержащиеся в нем значения представляют собой смещения относительно сегментного регистра ss.

Стек явно и неявно широко используется при программировании. Например, в стек помещается адрес возврата при вызове подпрограмм, в стеке удобно временно хранить данные из регистров, т.к. запись содержимого пары регистров в стек и извлечение их из стека осуществляется однобайтовыми (при работе с индексными регистрами двухбайтовыми) командами.