044 223-51-64
Пн-Пт 10:00-18:00
контакты, схема проезда... SiteHeart

Особенности архитектуры процессоров 386, 486 и Pentium . Часть 3.

2.9. Переключение задач

 

Для многозадачных и многопользовательских операционных систем важна способность процессора к быстрому переключению выполняемых задач. Операция переключения задач процессора (Task Switch Operation) сохраняет состояние процессора и связь с предыдущей задачей, загружает состояние новой задачи и начинает ее выполнение. Переключение задач выполняется по инструкции межсегментного перехода (JMP) или вызова (CALL), ссылающейся на сегмент состояния задачи TSS (Task State Segment) или дескриптор вентиля задачи в GDT или LDT. Переключение задач может происходить также по аппаратным и программным прерываниям и исключениям, если соответствующий элемент в IDT является дескриптором вентиля задачи. Дескриптор TSS указывает на сегмент, содержащий полное состояние процессора, а дескриптор вентиля задачи содержит селектор, указывающий на дескриптор TSS.

Для возврата управления задаче, вызвавшей текущую задачу или ей прерванной, используется инструкция IRET. В регистре флагов имеется флаг вложенной задачи NT (Nested Task), который управляет функцией инструкции IRET. При NT=0 IRET работает обычным образом, оставаясь в текущей задаче. При NT=1 (текущая задача — вложенная) IRET выполняет переключение в предыдущую задачу.

Когда инструкции CALL, JMP или INT выполняют переключение задач, старый (кроме случая JMP) и новый TSS помечаются занятыми (меняется значение TYPE в их дескрипторах) и в поле обратной ссылки в новом TSS устанавливается значение селектора старого TSS. Инструкции CALL и INT, переключающие задачи, устанавливают в новой задаче бит NT. Прерывание, не вызывающее переключения задач, сбросит бит NT. Этот бит может устанавливаться и сбрасываться инструкциями POPF и IRET.

Каждая задача должна иметь связанный с ней TSS. Форматы TSS для 16-битных (80286) и 32-битных процессоров различны (рис. 3.16 и 3.17). Оба типа сегментов содержат образы регистров процессора, раздельные указатели стеков для уровней привилегий 0, 1 и 2 и обратную ссылку на селектор TSS вызвавшей задачи. Свободное поле TSS может использоваться по усмотрению ОС. TSS 386+ содержит еще и битовую карту разрешения ввода-вывода, а также бит отладочной ловушки Т (при Т==1 переключение в данную задачу вызывает исключение отладки). Последним элементом TSS 386+ должен быть байт OFFh.

Значение поля лимита дескриптора для TSS 80286 должно превышать 002Bh, a для TSS 386+ - 0064h.

Карта разрешения ввода-вывода (I/O Permission Bit Map), расположенная в конце TSS 386+, имеет по одному биту на каждый адрес портов ввода-вывода. Разрешению обращения соответствует единичное значение бита. Максимальный размер таблицы (2000h), соответствующий всем 64К адресов, может быть ограничен лимитом TSS. Порты с адресами, не попавшими в усеченную таблицу, считаются недоступными.

Текущий TSS идентифицируется специальным регистром задачи TR (Task Register). Этот регистр содержит селектор, ссылающийся на дескриптор текущего TSS. Программно невидимые регистры базового адреса и лимита, связанные с TR, загружаются при загрузке в TR нового селектора.

Смена контекста сопроцессора при переключении задач автоматически не производится, поскольку новой задачи сопроцессор может и не понадобиться. Однако процессор обнаруживает первое использование сопроцессора после переключения задач и вырабатывает исключение 7. Обработчик этого исключения сам определит, необходима ли смена контекста. Всякий раз при переключении задач процессор устанавливает бит TS (Task Switched) в MSW. Это указывает на то, что контекст процессора может относиться к другой задаче. При выполнении инструкций ESC или WAIT, если TS=1 и MP=l (сопроцессор присутствует), вырабатывается исключение 7 (отсутствующий сопроцессор).

2.10. Страничное управление памятью

 

Страничное управление (Paging) является дополнительным средством для организации виртуальной памяти. В отличие от сегментации, которая организует программы и данные в модули различного размера, страничная организация подразделяет модули на множество небольших страниц одинакового размера. Страницы не имеют прямой связи с логической структурой данных или программ. В то время как селекторы можно рассматривать как логические имена модулей кодов и данных, страницы представляют части этих модулей. Учитывая обычное свойство локальности (близкого расположения требуемых ячеек памяти) кода и ссылок на данные, в оперативной памяти в каждый момент времени следует хранить только небольшие области сегментов, необходимые активным задачам. Эту возможность (а следовательно, и увеличение допустимого числа одновременно выполняемых задач при ограниченном объеме оперативной памяти) и обеспечивает страничное управление памятью.

Механизм страничного управления использует двухуровневую табличную трансляцию линейного адреса в физический.

Механизм имеет три части: каталог страниц (Page Directory), таблицы страниц (Page Tables) и собственно страницы (Page Frame). Механизм включается установкой бита PG=1 в регистре CRO. Регистр CR2 хранит линейный адрес отказа (Page Fault Linear Address) и адрес памяти, по которому был обнаружен последний отказ страницы. Регистр CR3 хранит физический адрес каталога страниц (Page Directory Physical Base Address). Его младшие 12 бит всегда нулевые (каталог выравнивается по границе страницы).

Каталог страниц размером 4 Кб имеет 1024 строки (вхождения). Каждая строка содержит 20 старших бит адреса таблицы следующего уровня (младшие биты этого адреса всегда нулевые) и признаки (атрибуты) этой таблицы. Индексом поиска в каталоге страниц является 10 старших бит линейного адреса (А22-А31).

Каждая таблица страниц также имеет 1024 строки аналогичного формата, но эти строки содержат базовый физический адрес (Page Frame Address) и атрибуты самих страниц. Индексом поиска в таблице являются биты А12-А21 линейного адреса. Физический адрес собирается из адреса страницы, взятого из таблицы, и младших 12 бит линейного адреса.

Строки каталога и таблиц имеют следующие биты атрибутов:

• Р (Present) — бит присутствия. P=l означает возможность использования данной строки для трансляции адреса. Бит присутствия вхождений в таблицы, используемые текущим исполняемым кодом, должен быть установлен. Программный код не должен его изменять “на ходу”.

• A (Accesed) — признак доступа, который устанавливается перед любым чтением или записью по адресу, в преобразовании которого участвует данная строка.

• D (Dirty) — признак, который устанавливается перед операцией записи по адресу, в преобразовании которого участвует данная строка. Таким образом помечается “грязная” страница, которую в случае замещения необходимо выгрузить на диск.

Биты Р, А, D модифицируются процессором аппаратно в заблокированных шинных циклах. При их программной модификации в многопроцессорных системах должен использоваться префикс LOCK, гарантирующий сохранение целостности данных.

Поле OS Reserved программно используется по усмотрению ОС и может хранить, например, информацию о “возрасте” страницы, необходимую для реализации замещения по алгоритму LRU (Least Recently Used — наиболее давно не использовавшаяся страница замещается первой).

Бит PWT (Page Write Through) определяет политику записи при кэшировании, а бит PCD (Page Cache Disable) запрещает кэширование памяти для обслуживаемых страниц (используются на процессорах 486+).

Механизм защиты страниц различает два уровня привилегий: пользователь (User) и супервизор (Supervisor). Пользователю соответствует уровень привилегий 3, супервизору — уровни 0, 1 и 2. Строки таблиц имеют атрибуты защиты страниц — биты U/S (User/Supervisor) и R/W (Read/Write). Эти атрибуты в строке каталога страниц относятся ко всем страницам, на которые ссылается данная строка через таблицу второго уровня. Атрибуты защиты в строке таблицы страниц относятся к конкретной странице памяти, которую она обслуживает.

Обращение при каждой операции доступа к памяти через две таблицы, расположенные в памяти, существенно снижает производительность процессора. Для предотвращения этого замедления в процессор введен буфер ассоциативной трансляции TLB (Translation Looakside Buffer) для хранения интенсивно используемых строк таблиц. В большинстве процессоров буфер представляет собой четырехканальный наборно-ассоциативный кэш на 32 строки таблиц трансляции. Такой размер позволяет хранить информацию о трансляции 128 Кб памяти, что в большинстве случаях мультизадачного использования дает коэффициент кэш-попаданий 98%, то есть только 2% обращений к памяти требуют дополнительных обращений к таблицам.

Когда страничное управление разрешено (бит PG==1 в CRO), блок страничной переадресации получает 32-битный линейный адрес от блока сегментации. Его старшие 20 бит сравниваются со значениями из TLB, и в случае попадания физический адрес вычисляется с использованием значения начального адреса страницы, полученного из TLB, и выводится на шину адреса. Если соответствующей строки в TLB нет, то производится чтение строки из страничного каталога. Если строка имеет бит Р==1 (таблица присутствует в памяти), в ней устанавливается бит доступа А и производится чтение ею указанной строки из таблицы второго уровня. Если и в этой строке Р=1, процессор обновляет в ней биты А и D, вычисляет физический адрес и, наконец, производит по нему обращение. Если на этом пути встречается Р=0, вырабатывается исключение 14, обработчик которого должен принять меры по загрузке затребованной страницы в оперативную память. Поскольку это исключение классифицируется как отказ, после его обработки (успешной) повторяется доступ к затребованной ячейке памяти. Во время его обработки может еще раз возникнуть исключение 14, но это не приведет к двойному отказу.

Исключение 14 может возникать и при нарушении прав доступа, определяемых уровнем привилегий и битами U/S и R/W. Для идентификации причины отказа в стек помещается 16-битный код ошибки, формат которого приведен на рис. 3.20. Хотя названия бит совпадают с атрибутами строк, их назначение отличается. Бит U/S указывает на уровень привилегий, при котором случился отказ (U/S=1 - пользователь, V/S=0 — супервизор). Бит W/R указывает на операцию, при которой произошел отказ (W/R=0 — чтение, W/R=1 — запись). Бит Р указывает на причину отказа (Р=1 — отсутствие страницы в памяти, Р=0 — нарушение защиты). Биты U не используются.

Операционная система должна корректно сгенерировать начальные таблицы трансляции и обрабатывать исключения отказов. В случае изменения таблиц она должна очищать буфер TLB путем загрузки регистра CR3. Очистка TLB должна производиться и при изменении значений бита Р в любых таблицах.

В отличие от “непробиваемой” сегментной защиты, способы обхода страничной защиты есть и на уровне пользователя.

Процессоры Pentium и старше позволяют оперировать страницами с размером 4 Мбайт, что позволяет экономить “накладные расходы” на обслуживание страничного режима при возросших потребностях программных модулей в памяти.

 

2.11 Режим виртуального 8086 (V86)

 

Прикладные программы для 8086 могут исполняться на 32-разрядных процессорах как в реальном режиме, так и в режиме виртуального 8086 (V86), который является особым состоянием задачи защищенного режима. Режим V86 более привлекателен своими возможностями и гибкостью. В этом режиме работает защита и механизм страничной переадресации, позволяющий адресоваться к любой области 4-гигабайтного пространства памяти. Выполнение приложений 8086 в среде V86 возможно параллельно с приложениями защищенного режима. Кроме того, страничная переадресация позволяет нескольким V86 совместно использовать общие области кода операционной системы.

Одним из основных различий реального и защищенного режима является трактовка содержимого сегментных регистров. В режиме V86, как и в реальном, для получения линейного адреса содержимое сегментных регистров сдвигается на четыре разряда влево и суммируется с эффективным адресом. Как и в реальном режиме, превышение исполнительным адресом границы 64 Кб вызывает исключение 12 или 13. Настоящий 8086 в таком случае переходит к нулевым адресам того же сегмента, как бы свернутого кольцом.

Один мегабайт адресуемого таким образом пространства с помощью страничной трансляции может отображаться в любую область 4 Г6 физической памяти. Поскольку таблица трансляции задается управляющим регистром CR3, в многозадачном применении при переключении задач автоматически загрузится и требуемая таблица трансляции.

Все программы, выполняемые в режиме V86, имеют уровень привилегий 3, то есть минимальные привилегии (реальный режим подразумевает уровень привилегий 0). Таким образом, программы в V86 выполняются со всеми проверками защиты. Попытка выполнения привилегированных инструкций вызывает исключение 13. К этим инструкциям относятся LIDT, LGDT, LMSW, CTS, HLT, операции с регистрами DRn, TRn, CRn.

Попытка выполнения инструкций, допустимых только для защищенного режима - LTR, STR, LLDT, SLDT, LAR, LSL, ARPL, VERR и VERW, - вызовет исключение 6.

В режиме V86 понятие чувствительности к уровню привилегий ввода-вывода (lOPL-sensitive) имеет особую трактовку. Здесь чувствительными являются инструкции INT п, PUSHF, POPF, STI, CLI и IRET, которые могут воздействовать на флаг прерываний IF. В этом режиме флаг IF виртуализируется для задач. Однако инструкции INT3, INTO и BOUND не чувствительны к IOPL. Инструкции ввода-вывода IN, OUT, (REP) INS, (REP) OUTS в режиме V86 не чувствительны к IOPL, а управление доступом к портам осуществляется только через битовую карту ввода-вывода в сегменте состояния задачи. Попытка обращения к запрещенным портам вызовет исключение 13. Битовая карта может быть и усеченной, тогда “отрезанные” адреса будут соответствовать запрещенным портам, но байт-терминатор OFFh должен обязательно вписываться в лимит TSS.

Прерывания в V86 для полной эмуляции машины на 8086 обрабатываются особым образом. Все прерывания и исключения влекут за собой смену уровня привилегий обратно к уровню операционной системы защищенного режима. Эта ОС может распознать, что прерывание пришло из V86, по образу регистра EFLAGS в стеке. Далее ОС может либо обработать это прерывание самостоятельно, либо переслать его к ОС реального режима, работающей в V86.

В конечном итоге ОС защищенного режима может совершенно прозрачно для приложения 8086, работающего в V86, эмулировать окружение обычной машины 8086, включая прерывания и перехватывая обращения к портам.

Вход в режим V86 — установка бита VM в регистре EFLAGS — возможен одним из двух способов:

• выполнение инструкции IRET в 32-битном режиме, когда образ EFLAGS сохранен в стеке с установленным битом VM (при CPL==0, иначе бит VM не установится);

• переключение задач на задачу-386, у которой в TSS образ EFLAGS имеет установленный бит VM.

Выход из режима V86 возможен только при обработке прерывания. Если вызываемая процедура имеет CPL==0, то бит VM будет сброшен и она будет выполняться в защищенном режиме. Если ее CPL > 0, произойдет исключение 13 — нарушение защиты. Если прерывание вызывает переключение задач, состояние регистров с установленным флагом VM сохранится в TSS старой задачи, к которой можно будет вернуться. Новый режим (защищенный или V86) установится в соответствии с TSS новой задачи.

Значение бита VM не может изменено никакими другими способами; кроме того, его значение не может быть и прочитано — при любом программном сохранении регистра флагов значение VM всегда показывается нулевым. Так что приложение, выполняемое в среде V86, никак не может ни переключить режим процессора, ни распознать, в каком режиме — реальном или виртуальном — оно исполняется. Это, конечно же, справедливо при корректно построенном мониторе виртуальной машины V86, являющимся частью ОС защищенного режима. Процессор для этого предоставляет лишь все необходимые аппаратные средства, позволяющие выполнить полную эмуляцию машины 8086.

 

2.12. Математический сопроцессор

 

Математический сопроцессор предназначен для расширения вычислительных возможностей центрального процессора — выполнения арифметических, тригонометрических, экспоненциальных и логарифмических операций. Сопроцессор поддерживает семь типов данных: 16-, 32-, 64-битные целые числа; 32-, 64-, 80-битные числа с плавающей точкой и 18-разрядные числа в двоично-десятичном формате. Формат чисел с плавающей точкой соответствует стандарту IEEE 754. Применение сопроцессора повышает производительность вычислений в сотни раз. С программной точки зрения сопроцессор и процессор выглядят как единое целое. Физически сопроцессор может быть отдельной микросхемой (387-й), подключаемой к локальной шине основного процессора, или располагаться прямо на кристалле центрального процессора (486+). В любом случае сопроцессор исполняет только свои специфические команды, а всю работу по декодированию инструкций и доставке данных осуществляет CPU. Сопроцессор может выполнять вычисления параллельно с работой центрального процессора, не обращая внимание и на переключение задач в защищенном режиме. Синхронизация автоматически обеспечивает ожидание окончания выполнения предыдущей инструкции сопроцессора перед началом выполнения новой (кроме инструкции инициализации, немедленно прерывающей работу сопроцессора) — применения отдельной инструкции WAIT перед каждой командой не требуется (как и в 80287).

Сопроцессор может работать в реальном и защищенном режиме и переключать режим разрядности 16/32. Эти режимы влияют только на формат отображения регистров сопроцессора в оперативной памяти, форматы используемых внутренних регистров не изменяются. После аппаратного сброса сопроцессор устанавливается в реальный режим, в котором он программно совместим (обратно) с 8087 и 80287. В защищенный режим сопроцессор переключается по инструкции FSETPM, из которого может вернуться в реальный по инструкции FRSTPM. Перевод в защищенный режим изменяет форматы административных инструкций FLDENV, FSTENV, FRSTOR и FSAVE. Эти инструкции обычно используются только обработчиками исключений, так что на прикладном уровне сопроцессор 32-разрядного процессора (для краткости будем обозначать его как 387+) в любых режимах обратно совместим с 8087 и 80287.

2.13. Система команд

Система команд 32-разрядных процессоров является существенно расширенной системой команд 8086/80286. Расширения касаются увеличения разрядности адресов и операндов, более гибкой системы адресации, появления принципиально новых типов данных (битовые строки и поля) и команд.

Для 32-разрядных процессоров (386+) разрядность “слова” (word) по умолчанию может составлять 32 бит, а не 16. Это распространяется на многие инструкции, включая и строковые. В реальном режиме и режиме виртуального 8086 по умолчанию используется 16-битная адресация и 16-битные операнды типа word. В защищенном режиме режим адресации и разрядность слова по умолчанию определяются дескриптором кодового сегмента. Перед любой инструкцией может быть использован префикс переключения разрядности адреса или слова относительно умолчания.

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

Инструкции пересылки данных (см. Приложение) позволяют передавать константы или переменные между регистрами и памятью в различных комбинациях, но в памяти может находиться не более одного операнда. Заметим, что инструкции пересылки не влияют на содержимое регистра флагов.

Операции ввода-вывода (см. Приложение) возможны непосредственным указанием адреса (0000-OOFFh) или с адресацией через регистр DX (0000-FFFFh). Ввод-вывод строк возможен только для 286+.

Операции со стеком (см. Приложение) выполняются словами с разрядностью, определяемой текущим режимом 386+. При помещении в стек слова SP уменьшается на число его байт (2 или 4), при извлечении — увеличивается.

Арифметические и логические операции (см. Приложение) выполняются над операндами, расположенными в регистрах, памяти, и непосредственным операндом (использование обоих операндов в памяти невозможно). Умножение и деление для 8086 возможно только с аккумулятором, результат для 16-битных операндов расширяется в DX. Для 286+ возможно двух- и трехадресное умножение с расширением только в старший байт (два байта для 386+).

Сдвиги и вращения (циклические сдвиги) (см. Приложение) выполняются над операндом типа r/m. Число позиций, на которое производится сдвиг, берется из непосредственного операнда или регистра CL по модулю 8 для однобайтного операнда и по модулю 16 или 32 для операнда-слова, в зависимости от разрядности данных (32 только для 386+).

Строковые операции (см. Приложение) выполняются с операндами в памяти, адресуемыми регистрами DS:[SI] (источник) и ES:[DI] (приемник). Операции могут использоваться с префиксами условного или безусловного повтора. После каждой пересылки или сравнения индексные регистры (SI, DI или оба) участвующих операндов автоматически инкрементируются или декрементируются на количество байт, участвующих в операции (1, 2 или 4). Направление модификации определяется флагом DF: DF=0 — инкремент, DF=l - декремент.

Операции с флагами (см. Приложение) позволяют изменять значения отдельных флагов, а также сохранять их значение в стеке (или регистре АН) и восстанавливать сохраненные значения.

Передача управления осуществляется с помощью инструкций переходов и вызовов (см. Приложение).

Безусловный переход (JMP) может быть как внутрисегментным (ближним или коротким), так и межсегментным (дальним). Адрес перехода может непосредственно указываться в команде, а при косвенной адресации адрес перехода находится в регистре или памяти (r/m) и может иметь дополнительные слагаемые. Короткий переход (short) может передавать управление только на адрес target, удаленный от текущего в пределах -128... +127 байт, ближний (near) ~ в пределах сегмента. При дальнем (far) переходе адрес target (непосредственный или косвенный) включает новое значение указателя инструкций и значение (или селектор) сегмента кода, обеспечивая доступ к любой точке памяти (в пределах, разрешенных защитой).

Условные переходы в 8086 и 80286 возможны только короткие (8-байтное смещение), процессоры 386+ допускают удаление в пределах 16- или 32-байтно-го смещения, в зависимости от режима адресации. Условные переходы выполняются по содержимому регистра СХ (ЕСХ) и состоянию флагов. На флаги влияют только команды арифметических и логических операций, сравнения и загрузки регистра флагов.

Инструкция вызова подпрограммы (CALL) передает управление в точку target, сохраняя адрес следующей за ней инструкции в стеке. По инструкции возврата (RET) этот адрес восстановится в указатель инструкций (и CS при дальнем вызове). Как и безусловный переход, вызов и возврат могут быть как внутрисегментными (ближним), так и межсегментными, допуская те же режимы адресации.

Межсегментные вызовы и возвраты в защищенном режиме осуществляются через вентили вызовов.

Поддержка языков высокого уровня включена в процессоры 286+ (см. Приложение). Инструкция ENTER, выполняемая как первая операция вызванной процедуры, эквивалентна следующей последовательности:

PUSH BP; (выполняется frms раз) MOV ВР,8Р;

PUSH SP;

SUB SP,frmsiz; (выделение динамической области в стеке).

Обратная инструкция LEAVE используется непосредственно перед выходом из процедуры по инструкции RET.

С прерываниями связана группа инструкций, явно их вызывающих, и возврат из прерывания (см. Приложение). Аппаратные прерывания управляются флагом IF, значение которого может меняться командами CLI, STI и загрузки (восстановления) регистра флагов. Кроме того, ряд инструкций в процессорах 286+ может вызвать исключения различных типов.

Отдельную группу составляют команды синхронизации и останова (см. Приложение).

Инструкции управления защитой — загрузки и сохранения регистров дескрипторов, задачи и MSW, проверки и выравнивания привилегий — доступны для процессоров 286+ (табл. 3.23).

Битовые операции (см. Приложение) выполняются только на процессорах 386+. Операции выполняются над 16- или 32-битным словом памяти или регистром. Инструкции BSF, BSR и ВТ не изменяют значения слова; ВТС, BTR и BTS воздействуют на указанный бит слова т/т. Номер интересующего бита берется из операнда по модулю 16 или 32, в зависимости от разрядности.

Обмен данными с управляющими регистрами CRn, регистрами отладки DRn и тестирования TRn (см. Приложение) выполняется только для 386+ (в предыдущих процессорах этих средств не было).

Инструкции идентификации применимы к процессорам, начиная с класса Pentium, и к некоторым процессорам класса 486 (см. Приложение).

Инструкции управления кэшированием (см. Приложение) появились с процессорами 486.

Инструкции, исполняемые математическим сопроцессором 8087/80287/ 80387 и встроенным FPU 486DX и Pentium, имеют специфику задания операндов.

Загрузка данных начинается с декремента указателя стека сопроцессора (поле TOP) — перемещения вершины. Если новая вершина не пустая (по полю TAG) или стек исчерпан, вызывается исключение с указанием причины. После загрузки поле TAG устанавливается в соответствии с загруженным числом. При извлечении из стека с выталкиванием производится инкремент ТОР, а в поле TAG старой вершины устанавливается признак пустой ячейки. Попытка использования пустого регистра в операциях или при сохранении результатов в памяти вызывает исключение. Исключения могут возникнуть и в других случаях. Отдельные источники исключений могут быть замаскированы битами регистра управления сопроцессора. Общее маскирование прерывания возможно только в сопроцессоре 8087.

Группа инструкций сравнения данных FPU приведена в Приложении. Собственно обработку данных выполняют инструкции арифметики (см. Приложение) и трансцендентных функций (см. Приложение). Отдельная группа инструкций предназначена для управления сопроцессором (см. Приложение).

Процессоры с расширением ММХ имеют дополнительный набор инструкций (см. Приложение).

Синтаксис инструкций ММХ включает следующие элементы:

  • префикс Р
  • (Packed), указывающий на обработку упакованных форматов;
  • мнемонику операции (например,
  • ADD, CMP или XOR);
  • суффикс:
    • US (Unsigned Saturation) — насыщение беззнаковое;
    • S (Signed saturation) — насыщение знаковое;
    • В,
    • W, D, Q, — тип данных: упакованные байты, слова, двойные слова или учетверенное слово.

Инструкции, у которых типы входных и выходных данных различаются (например, преобразования), имеют два суффикса.

Для инструкций пересылки данных операнды источника и назначения могут находиться в памяти (т32 или т64), целочисленных регистрах (ir32) или регистрах ММХ (mm). Для остальных инструкций, кроме вышеперечисленных, операнд-источник может быть и непосредственным, а операнд назначения всегда является регистром ММХ. Для операндов, находящихся в памяти, применимы все существующие режимы адресации.

В табл. Приложения приняты следующие обозначения:

• src операнд-источник;

• dest операнд назначения;

• reg - 8/16/32-битный регистр;

• regl6 только 16-битный регистр;

• reg32 только 32-битный регистр;

• mem — 8/16/32-битная ячейка памяти, адресуемая регистрами процессора;

• r/m 8/16/32-битный регистр или ячейка памяти, адресуемая регистрами процессора;

• r/m/i — 8/16/32-битный регистр, ячейка памяти, адресуемая регистрами процессора, или непосредственный операнд;

• addr — 16/32-битный адрес;

• immed непосредственный операнд.

В одной инструкции невозможно использование двух операндов, расположенных в памяти (за исключением команды MOVE и операций со стеком).

 

 

Категория: