Описание процессора i8086 для программиста

         

Префиксы


Префиксы модифицируют выполнение основной команды. Код каждого префикса занимает один байт.

Микропроцессор 8086 имеет 7 префиксов, делящихся на три группы. В коде одной команды могут присутствовать до трёх префиксов, обязательно относящихся к разным группам. Реакция микропроцессора на использование в команде нескольких префиксов из одной группы непредсказуема.

В первую группу входит единственный префикс блокировки шины LOCK

(шестнадцатеричный код префикса F0). Когда он присутствует в команде, на всё время выполнения инструкции системная шина захватывается данным микропроцессором, блокируя запросы к ней со стороны других процессоров многопроцессорной системы.

Во вторую группу входят префиксы повторения операции REP/REPE/REPZ

(F3) и REPNE/REPNZ (F2). Хотя для этой группы предусмотрено пять мнемоник, реально задействовано два кода префиксов. Они используются совместно со строковыми операциями с целью обработки нескольких байтов или слов одной командой.

Префиксы блокировки шины и повторения в программе на языке ассемблера располагаются непосредственно перед мнемоникой основной команды, совместно с которой они используются, например: LOCK OR [BX], AL.

К третьей группе относятся четыре префикса замены сегмента, имеющих следующие коды: 26 – сегмент ES, 2E – сегмент CS, 36 – сегмент SS, 3E – сегмент DS. В отличие от префиксов двух других групп, префиксы замены сегмента на языке ассемблера указываются уже после мнемоники основной команды и входят в состав операнда в памяти, сегмент которого они явно указывают, например: MOV ES:[BX], CX.

Некоторые сложности при программировании на языке ассемблера могут возникнуть при необходимости использовать префикс замены сегмента совместно со строковой операцией. Операнды строковых команд располагаются в сегментах DS и ES, причём заменить на другой можно только сегмент DS. Проблема заключается в том, что строковые инструкции не имеют явно задаваемых операндов, поэтому некуда включить префикс замены сегмента. Некоторые трансляторы с языка ассемблера, например MASM фирмы Microsoft и TASM фирмы Borland позволяют совместно с мнемоникой строковой операции указать формальные операнды, проверяемые синтаксически, но не играющие никакой роли при формировании кода операции. В этих операндах может быть указан и префикс замены сегмента. В некоторых случаях, однако, приходится вносить в программу непосредственно код префикса замены сегмента, предшествующий соответствующей строковой инструкции. Например, следующие две строки на языке ассемблера задают выполнение операции пересылки строк MOVSB с использованием префикса повторения REP

и префикса замены сегмента CS:

DB  2Eh

REP MOVSB



Содержание раздела