Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОЭВМиС.Метод.Лабы

.pdf
Скачиваний:
14
Добавлен:
13.03.2016
Размер:
355.85 Кб
Скачать

Справочная информация

Регистры

В процессоры, использующие ММХ, добавлено 8 новых 64-разрядных регистров ММО-ММ7. Они могут быть использованы только для выполнения операций с типами данных ММХ. Команды ММХ позволяют задавать в качестве операндов как регистры общего назначения (ЕАХ, ЕВХ, ECX, EDX, ЕВР, ESI, EDI и ESP), так и переменные в памяти, используя для этого стандартную схему адресации, принятую в процессорах х86. Хотя ММХ-регистры и имеют ни с чем не совпадающие названия, на самом деле они являются “псевдонимами” регистров сопроцессора (st0-st7). Это означает, что, изменяя один из регистров ММХ в своей программе, мы в то же время изменяем регистры сопроцессора. Зачем такие сложности? Не проще ли было их сделать “раздельными”? В конце концов, для этого понадобилось бы не так уж и много усилий со стороны разработчиков процессора... Очевидно, это было сделано не только с целью добавить работы программистам. Как всегда, все дело в совместимости. Если бы было сделано так, как подсказывает логика, то пришлось бы переписать операционную систему! Те, кто знаком с работой процессора в защищенном режиме, наверное, уже догадались, о чем идет речь. Конечно же, о мультизадачности. Дело в том, что в многозадачной среде программы должны быть независимы друг от друга. При переключении с одной задачи на другую значения всех регистров “старой” задачи должны быть сохранены. В настоящее время о сохранении регистров микропроцессора заботится сам микропроцессор, а о сохранении регистров сопроцессора заботится операционная система. Так как все регистры ММХ одновременно являют собой регистры FPU (Floating Point Unit — сопроцессор), то операционная система, сохраняя регистры FPU, сохраняет и регистры ММХ! Проблема решена, кроме того, она избавила нас от ожидания выхода Windows 95 ММХ. Программист должен заботиться о том, чтобы код, использующий FPU и ММХ, работал корректно. Код одного типа (ММХ или FPU) должен быть по возможности сгруппирован. Для достижения наибольшей производительности в программе не должно быть условных переходов из части кода, использующего FPU, к коду, использующему ММХ. После того как работа с ММХ завершена, нужно очистить регистры MM0-MM7. Это делается для того, чтобы в последующем сопроцессор не столкнулся с “грязными” регистрами непонятного формата. Для этого используется новая инструкция EMMS, которая помечает все регистры FPU как “пустые”.

Префиксы

Всем инструкциям х86 ставится в соответствие число - код операции. Длина кода операции один-два байта. Ему может предшествовать байт SIB (Scaleмасштаб, Index-индекс, Base-база), определяющий полный режим адресации. В процессоре х86 перед инструкцией также возможно присутствие префиксов, несколько модифицирующих “смысл” команды (префикс замены сегмента, префикс команды). Инструкции ММХ формируются точно так же, как и “старые” команды.

(8 бит x 8) восемь упакованных байтов

b1

 

b2

 

b3

 

b4

b5

 

b6

 

b7

 

b8

 

 

 

 

 

 

 

 

 

 

 

 

(16

бит x 4) четыре упакованных слова

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

W3

 

 

W2

 

W1

 

 

W0

(32

бит x 2)

два упакованных двойных слова

 

 

 

 

 

 

 

d1

 

 

 

 

 

d0

 

 

 

 

 

 

 

 

 

 

 

 

(64

бит x 1)

64-разядное целое

 

 

 

 

 

 

 

q0

Возможные варианты интерпретации регистров

Распаровка (paring)

Точно так же, как и “обычные” инструкции микропроцессора, инструкции MMX могут выполняться в паре с другой инструкцией одновременно. Более того, в некоторых случаях возможно одновременное выполнение двух инструкций MMX. Операции сдвига и умножения могут быть выполнены как на и-, так и на v-конвейере. Ограничения, накладываемые на возможность распаровки, следующие:

Две инструкции, использующие блок сдвигов MMX (инструкции упаковки/распаковки и сдвига), не могут выполняться одновременно.

Две инструкции, использующие блок умножения MMX (инструкции типа pmul, pmulh, pmadd), не могут выполняться в паре.

Инструкции MMX, которые обращаются к памяти, могут выполняться только на и-конвейере,

Целевой регистр ММХ-инструкции, попавшей в и-конвейер, не должен

совпадать с регистром-источником инструкции, попавшей на v- конвейер (тест на зависимость). То есть пара инструкций:

paddb mmreg2, mmregl

paddb mmregЗ, mmreg2

не может выполняться одновременно,

Инструкция EMMS не паруется.

Если установлены CR0.TS или CR0.EM, то ММХ-инструкции не могут быть выполнены на v-конвейере.

Типы данных

MMX поддерживает данные в упакованном формате. Это означает, что каждый 64-битовый регистр MMX может интерпретироваться как:

1)Восемь байтов;

2)Четыре слова;

3)Два двойных слова;

4)Одна 64-разрядная переменная.

То, как интерпретируется конкретный регистр, отлично отображается в мнемонике команды. К примеру, инструкция PADDB складывает два операнда, полагая, что они являются набором байтов, а PADDW считает операнды набором слов.

Все инструкции можно разбить на следующие группы:

умножение PMULHW

PMULLW

вычитание PSUBB

PSUBD

PSUBSB

PSUBSW

PSUBUSB

PSUBUSW

PSUBW

 

команды сравнения проверка равенства

PCMPEQB PCMPEQD

PCMPEQW сравнение PCMPGTB PCMPGTD

PCMPGTW

команды упаковки/распаковки

PUNPCKHBW PUNPCKHDQ PUNPCKHWD PUNPCKLBW PUNPCKLDQ PUNPCKLWD PACKSSDW PACKSSWB PACKUSWB

логические команды

 

PAND

 

 

PANDN

 

 

 

 

 

 

 

 

POR

 

 

PXOR

 

 

 

 

 

 

 

 

команды

передачи

 

 

 

 

данных

 

 

 

 

 

MOVD

 

 

MOVQ

 

 

 

 

 

 

 

 

 

 

 

команда сдвига

логический Влево сдвиг

PSLLD PSLLQ

PSLLW

арифметические

команды

сложение PADDB PADDD

арифметический сдвиг вправо PSRAD PSRAW

 

PADDSB PADDUSB

PADDSW

логический

сдвиг

 

 

 

PADDUSW

вправо PSRLD PSRLQ

 

PADDW

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

сложение и умножение

 

 

команды,

 

 

 

 

 

 

 

очищавшие

 

 

 

 

 

 

 

регистры

 

 

PMADDWD

 

 

EMMS

 

 

 

 

 

 

 

 

 

 

 

 

 

Краткое описание команд

Приведем описание лишь некоторых инструкций, помогающих понять суть работы ММХ.

MOVD

Формат MOVD mmregl, reg32/mem32 MOVD reg32/mem32, mmregl

Описание

Инструкция MOVD пересылает 32 младших бита регистра ММХ в регистр общего назначения или память Или же из регистра общего назначения/памяти в регистр ММХ В последнем случае, кроме собственно пересылки, биты 32-64 соответствующего регистра обнуляются

PADDB

Формат PADDB mmregl, mmreg2/mem64

Описание

Складывает восемь 8-разрядных чисел операнда источника (ММХ-регистра или 64-разрядного поля памяти) и восемь 8-разрядных чисел операнда- получателя (регистра ММХ) В случае переполнения полученные значения заворачиваются (то есть 255+10=9) без установки флага переноса при подсчете последующих байтов Результат помещается в операнд-получатель

PADDSW

Формат PADDSW mmregl, mmreg2/mem64

Описание

Складывает четыре 16-битных числа со знаком операнда источника (регистра ММХ или 64-разрядного поля памяти) и четыре соответствующих значения операнда-получателя (регистра ММХ) Если сумма каких-либо двух из них менее чем -32768 (8000h), то результат сложения -32768 (8000h) Аналогично в случае, когда сумма превышает 32767 (7FFFh), возвращаемый результат — 32767 (7FFFh). Результат заносится в операнд-получатель. Следующий список возможных ситуаций помогает понять, как происходит сложение

Если число D250h (-11696) складывается с 88Q7h (-30713), то получаемый результат 8000h (-32768)минимально возможное 16-разрядное число

Если число 5321h (+21281) прибавляется в ЕС22h (-5086), то получаемый результат 3F43h (+ 16195)

Сумма 16-разрядного числа7007П (+28679) и OFF9h (+4098) дает результат 7PFFh (+32767) — максимально возможное положительное число

Если к FFFFh(-1) прибавить FFFFh(-1), то получим FFFEh (-2)

PCMPEQB

Формат PCMPEQB mmregl, mmreg2 /mem64

Описание

Сравнивает источник с получателем, рассматривая операнды как упакованные байты. Если биты операндов эквивалентны, то все биты 8- разрядной части получателя устанавливаются равными единице, в противном случае они обнуляются

PCMPGTD

Формат

PCMPGTB mmregl, mmreg2/mem64

Описание

Аналогична PCMPEQ, но в отличие от нее биты в целевом операнде устанавливается в том случае, когда байт целевого операнда больше соответствующего байта операнда источника

PACKUSWB

Формат PACKUSWB mmregl, mmreg2/mem64 Описание

Описание

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

если слово содержит отрицательное число, то соответствующий ему байт будет равен нулю,

если значение слова превышает 255, то соответствующий ему байт будет равен 255

Команды ММХ имеют такой формат

инструкция mmreg1, mmreg2/mem64

То есть источником может быть как переменная памяти, так и регистр ММХ. А целевым может быть только регистр ММХ, К тому же MOVD и MOVQ допускают пересылки из регистров ММХ в память, Одним из первых вопросов у меня был, зачем так много команд? Ведь количество операций не так уж и велико... Дело в том, что название команды формируется из двух частей. Первая часть говорит о том, что она делает (MOV, PSUB, PADD). Вторая же говорит о том, как она интерпретирует операнды. Рассмотрим команду PACKUSWB. Первая часть строки — PACK — указывает, что будем что-то упаковывать. Вторая же — USWB — в свою очередь разбивается на две — US и WB. US говорит о том, что результат будет беззнаковым с сатурацией, WB же указывает, что источник — упакованные слова, результат — упакованные байты. Благодаря такой записи смысл инструкции схватывается “на лету”, по этой же причине и команд так много. Приведем полный перечень мнемоник:

Р — упакованные данные (Packed data)

В — байт (byte) W — слово (word)

D — двойное слово (DoubleWord)

Q — 64-битовая переменная (QuadWord) S — знаковая (Signed)

U — беззнаковая (Unsigned)

SS — знаковая с сатурацией (Signed Saturation)

US —беззнаковая с сатурацией (Unsigned Saturation)

Список литературы

1)Б.Я. Цилькер. Организация ЭВМ и систем: Учебник для вузов / Б.Я. Цилькер, С.А. Орлов – СПб.: Питер, 2004.– 668с.

2)Кулаков В. Программирование на аппаратном уровне / В.*.Кулаков.–

СПб.: Питер, 2003.– 847с.

3)http://www.wasm.ru

4)http://ru.wikipedia.org

5)http://allasm.ru

6)http://citforum.uar.net

7)http://comprog.ru

8)http://www.kalashnikoff.ru

9)http://www.codenet.ru