Таненбаум Э.- Архитектура компьютера. стр.555

регистра в регистр АН и наоборот. Флаг переполнения находится в старшем байте регистра кода условия и во время выполнения вышеупомянутых команд не копируется. Команды и флаги, о которых идет речь в этом абзаце, введены, в первую очередь, для обратной совместимости с процессорами 8080 и 8085.

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

и повторяющиеся строковые операции

В следующей группе содержатся команды организации циклов. Команда 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.

Команды перехода и вызова

В последней группе табл. В.2. представлены команды условного и безусловного переходов, вызова подпрограмм и возврата. Простейшей из них является команда JMP.

Метка в ней может указывать на целевой адрес или на содержимое любого действительного адреса. Следует учитывать различие между ближним и дальним переходами. Объектом ближнего перехода является текущий кодовый сегмент, неизменный в период выполнения операции. В процессе дальнего перехода значение регистра CS, напротив, меняется. В случае непосредственной адресации с применением метки новое значение регистра кодового сегмента устанавливается при вызове после метки; в случае с действительным адресом из памяти выбирается длинное слово, в результате младшее слово оказывается соответствующим целевой метке, а старшее слово — новому значению регистра кодового сегмента.


⇐ Предыдущая страница| |Следующая страница ⇒