Организация циклов в Ассемблере. Команды управления циклами.



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

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

loop метка_перехода (Loop) — повторить цикл. Команда позволяет организовать циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Работа команды заключается в выполнении следующих действий:

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

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

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

o если (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:

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

o если (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:

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

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

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

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

 

 

Режимы адресации операндов в командах Ассемблера. Косвенная адресация. Модификация адресов, и индексирование.

Косвенная адресация По аналогии с регистровыми и непосредственными операндами адрес операнда в памяти также можно не указывать непосредственно, а хранить в любом регистре. До 80386 для этого можно было использовать только BX, SI, DI и BP, но потом эти ограничения были сняты и адрес операнда разрешили считывать также и из EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP (но не из AX, CX, DX или SP напрямую — надо использовать EAX, ECX, EDX, ESP соответственно или предварительно скопировать смещение в BX, SI, DI или BP). Например, следующая команда помещает в регистр AX слово из ячейки памяти, селектор сегмента которой находится в DS, а смещение — в BX:

mov ax,[bx]

 

 

Как и в случае прямой адресации, DS используется по умолчанию, но не во всех случаях: если смещение берут из регистров ESP, EBP или BP, то в качестве сегментного регистра используется SS. В реальном режиме можно свободно пользоваться всеми 32-битными регистрами, надо только следить, чтобы их содержимое не превышало границ 16-битного слова.

Модификация адресов

В ПК используется так называемая модификация адресов. Если в команде операнд берется из памяти, тогда сослаться на него можно указав некоторый адрес и некоторый регистр. В этом случае команда будет работать с так называе­мым исполнительным адресом, который вычисляется как сумма адреса, указанно­го в команде, и текущего значения указанного регистра. Именно из ячейки с та­ким адресом команда и будет брать свой операнд. Выгода от такого способа задания операнда заключается в том, что, меняя значение регистра, можно заста­вить одну и ту же команду работать с разными ячейками памяти, что, например, полезно при обработке массивов, когда одну и ту же команду надо применять к разным элементам массивов. Замена адреса, указанного в команде, на исполни­тельный адрес называется модификацией адреса, а используемый при этом ре­гистр называется модификатором. Во многих ЭВМ в качестве модификатора можно использовать любой из имеющихся регистров, но вот в ПК модификато­рами могут быть только регистры ВХ, ВР, SI и DI. В этом и заключается основ­ная специализация данных регистров. Отметим также, что в ПК модифицировать адрес можно не только по одному регистру, но и по двум сразу. Правда, в этом случае разрешено использовать не любую пару указанных модификаторов, а только такую, где один из регистров - это ВХ или ВР, а другой - это SI или DI.

 

 


Дата добавления: 2020-01-07; просмотров: 547; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!