<<
>>

Поле префиксов

Префиксы — необязательные однобайтные элементы машинной команды. Назна- чение префиксов — изменить действия, выполняемые командой. Префиксы могут указываться программистом явно при написании исходного текста программы, либо их, по определенным соображениям, может вставить ассемблер.
Процессор распознает префиксы по их значениям. Машинная команда может иметь до четы- рех префиксов одновременно. В памяти префиксы предшествуют команде. Поря- док их следования при этом может быть любым. Далее перечислены типы префиксов, которые может использовать прикладная программа. * Префикс замены сегмента в явной форме указывает, какой сегментный регистр используется в данной команде для адресации стека или данных. Префикс от- меняет выбор сегментного регистра по умолчанию. Префиксы замены сегмента имеют следующие значения: D 2Eh — замена сегмента CS; D 36h — замена сегмента SS; ? ЗЕh — замена сегмента DS; ? 26h — замена сегмента ES; D 64h — замена сегмента FS; D 65h — замена сегмента GS. * Префикс повторения используется с цепочечными командами (командами об- работки строк). Этот префикс «зацикливает» команду для обработки всех эле- ментов цепочки. Система команд поддерживает два типа префиксов: безуслов- ные (REP — ОFЗh), заставляющие цепочечную команду повторяться некоторое количество раз, и z/словмые(RЕРЕ/RЕРZ — ОFЗh, RЕРNЕ/RЕРNZ — ОF2h), которые при зацикливании проверяют некоторые флаги, и в результате проверки возможен досрочный выход из цикла. * Префикс блокировки шины инициирует выдачу процессором сигнала LOCK# (зна- чение OFOh) для блокировки системной шины. Используется в многопроцес- сорных конфигурациях для обеспечения монопольного владения системной шиной. Сигнал LOCK# может формироваться лишь с определенной номенклату- рой команд процессора, работающих в цикле «чтение-модификация-запись». ■ Префикс размера адреса (значение 67h) уточняет разрядность адреса: 16 или 32 бита.
Каждой команде, в которой используется адресный операнд, ставится в соответствие разрядность адреса этого операнда. Если разрядность адреса для данной команды составляет 16 битов, это означает, что команда содержит 16-раз- рядное смещение и оно соответствует 16-разрядному смещению адресного опе- ранда относительно начала некоторого сегмента (см. рис. 3.1). В контексте ма- териала главы 2 (см. рис. 2.7 и 2.8) это смещение называется эффективным адресом. Если разрядность адреса составляет 32 бита, это означает, что команда содержит 32-разрядное смещение, оно соответствует 32-разрядному смещению адресного операнда относительно начала сегмента и по его значению формиру- ется 32-разрядное смещение в сегменте (см. рис. 3.1). С помощью префикса раз- рядности адреса можно изменить действующее по умолчанию значение разряд- . ности адреса. Это изменение будет касаться только той команды, которой пред- шествует префикс. • Префикс размера операнда (значение 66h) аналогичен префиксу размера адре- са, но указывает на разрядность операндов (32 или 16 битов), с которыми рабо- тает команда. . По каким правилам устанавливаются по умолчанию значения атрибутов раз- рядности адреса и операндов? Если команда имеет операнд в памяти, то его адрес представляет собой значение смещения относительно начала сегмента данных (если не используется префикс переопределения сегмента) и содержится в поле смеще- ния машинной команды. Размер этого поля зависит от текущего режима адреса- ции (атрибуты usеlб или use32 в директивах сегментации). При 16-разрядной адресации размер поля смещения в машинной команде составляет 16 битов. При 32-разрядной адресации размер поля смещения в машинной команде составляет 32 бита. Явное задание префикса размера адреса позволяет указать процессору зна- чение, отличающееся от действующего по умолчанию. Например, если действую- щий размер адреса равен 16 битам, то использование перед какой-либо командой префикса 67h определит для нее (и только для нее!) размер адреса в 32 бита.
И на- оборот, если действующий размер адреса равен 32 бита, то указание перед коман- дой префикса 67h определит для нее (и только для нее!) размер адреса в 16 битов. Физически это будет отражаться на размере поля смещения в данной машинной команде. Префикс размера операнда ббh позволяет сменить действующий для данной команды атрибут размера операнда. Команда, которая по умолчанию работает со словом (16 битов) или с двойным словом (32 бита), имеет атрибут размера операн- да, равный 16 и 32 бита соответственно. Применение префикса размера операнда позволяет сменить действующий по умолчанию атрибут. При работе процессора i8О86 в реальном и виртуальном режимах атрибуты раз- мера адреса и операнда по умолчанию равны 16 битов. В защищенном режиме зна- чения этих атрибутов зависят от значения бита D дескриптора сегмента. Если D = 0, то атрибуты размера адреса и операнда равны 16 битов, если D = 1, то эти атрибуты рав- ны 32 бита. Изменить действующие по умолчанию атрибуты адреса и размера опе- рандов можно применением атрибутов usеlб или use32 в директивах сегментации. В реальном режиме с помощью префикса разрядности адреса можно задейство- вать 32-разрядную адресацию, но при этом необходимо помнить об ограниченно- сти размера сегмента величиной 64 Кбайт. Аналогично префиксу разрядности ад- реса можно использовать префикс разрядности операнда в реальном режиме для работы с 32-разрядными операндами (к примеру, в арифметических командах). В команде префиксы размера адреса и операнда могут указываться одновре- менно. Каким образом комбинация префиксов (указанных явно и установленных по умолчанию) влияет на атрибуты размера операнда и адреса машинной коман- ды, показано в табл. 3.1. В ней отражено и то, как влияет на эти атрибуты состоя- ние бита D дескриптора сегмента в защищенном режиме. Строки таблицы, соот- ветствующие нулевому значению бита D, используются в реальном и виртуальном режимах работы процессора i8О86. Необходимо обратить внимание на то, что команды работы со стеком также имеют аналогичные атрибуты размера и адреса операнда. Атрибут размера адреса влияет на выбор регистра — указателя стека: при размере адреса 16 битов использу- ется регистр SP, при размере адреса 32 бита используется регистр ESP. Аналогично влияет на работу команд со стеком префикс размера операнда: при использовании префикса размера операнда 16 битов операнд в стеке трактуется как 16-разряд- ный, при использовании префикса размера операнда 32 бита операнд в стеке трак- туется как 32-разрядный.
Таблица 3.1. Значения атрибутов размеров операнда и адреса

В качестве примера префикса, который при формировании машинной коман- ды вставляет сам ассемблер, можно привести префикс со значением OFFh. Он на- зывается префиксом смены алфавита и извещает о том, что поле кода операции в данной команде двухбайтовое.

<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Поле префиксов:

  1. Восходящий Лунный Узел во II поле. Нисходящий Лунный Узел в VIII поле
  2. Восходящий Лунный Узел в XII поле. Нисходящий Лунный Узел в VI поле
  3. Восходящий Лунный Узел в III поле. Нисходящий Лунный Узел в IX поле
  4. Восходящий Лунный Узел в VII поле. Нисходящий Лунный Узел в I поле
  5. Восходящий Лунный Узел в IX поле. Нисходящий Лунный Узел в III поле
  6. Восходящий Лунный Узел в VI поле. Нисходящий Лунный Узел в XII поле
  7. Восходящий Лунный Узел в VIII поле. Нисходящий Лунный Узел во II поле
  8. Восходящий Лунный Узел в I поле. Нисходящий Лунный Узел в VII поле
  9. 4.2.5. Восходящий Лунный Узел в V поле. Нисходящий Лунный Узел в XI поле
  10. Восходящий Лунный Узел в IV поле. Нисходящий Лунный Узел в X поле
  11. Восходящий Лунный Узел в XI поле. Нисходящий Лунный Узел в V поле
  12. 4.2.10 Восходящий Лунный Узел в X поле. Нисходящий Лунный Узел в IV поле
  13. Лилит в IV поле
  14. Лилит в VIII поле
  15. Венера IV поле
  16. Лулу в IX поле
  17. 2.3.9. Венера IX поле
  18. ПОЛЕ СОЗНАНИЯ
  19. Юпитер в Ш поле