Реклама:

В следующей группе содержатся команды организации циклов. Команда LOOP проводит отрицательное приращение регистра СХ и в случае положительного результата выполняет обратный переход к указанной метке. Команды LOOPZ, LOOPE, L00PNZ и L00PNE, помимо прочего, проверяют значение нулевого флага на предмет необходимости прекращения цикла до достижения регистром СХ нулевого значения.

Целевой адрес во всех командах категории LOOP должен отстоять от текущего положения счетчика команд не более чем на 128 байт; это связано с тем, что в командах предусмотрено 8-разрядное смещение со знаком. Количество команд (в отличие от байтов), через которые можно совершить переход, точно не определяется в силу различия между этими командами по длине. Как правило, первый байт задает тип команды, и во многих случаях содержание кодового сегмента команд им ограничивается. Второй байт часто определяет применяемые командой регистры и регистровый режим адресации, и если в команде используется смещение или содержатся непосредственные данные, ее длина увеличивается до четырех-шести байтов. Средняя длина команды составляет 2,5 байт, поэтому величина обратного перехода в циклах ограничивается примерно 50 командами.

Существует ряд специальных механизмов организации циклов строковых команд: REP, REPZ и REPNZ. Пять строковых команд, указанных в следующей группе табл. В.2, используют неявные адреса и автоинкрементный/автодекрементный режимы работы с индексными регистрами. Во всех этих командах регистр SI указывает на сегмент данных, а регистр DI - на дополнительный сегмент, основанный на содержании регистра ES. Как и REP, команда M0VSB позволяет единовременно перемещать целые строки. Длина строки определяется значением регистра СХ. Так как команда M0VSB не влияет на состояние флагов, средствами REPNZ провести проверку на наличие байта ASCII-нуля при копировании не представляется возможным; чтобы исправить эту ситуацию, нужно сначала запустить команду REPNZ SCASB, позволяющую разместить в регистре СХ осмысленное значение, а затем выполнить REP M0VSB. Пример практического применения этого механизма приводится в листинге кода копирования строки в разделе "Примеры". При работе со всеми упомянутыми командами следует уделять особое внимание сегментному регистру ES (если его значение не совпадает со значением регистра DS). Так как в интерпретаторе реализована малая модель памяти, ES = DS = SS.

Логические операции, побитовые операции и операции сдвига || Оглавление || Команды перехода и вызова