Особенности команд MMX-расширения

 

Важное отличие ММХ-команд от обычных команд процессора в том, как они реагируют на ситуации переполнения и заема. В ситуациях, когда результат арифметической операции выходит за размер разрядной сетки исходных операндов, производится усечение старших бит результата и возвращаются только те биты, которые умещаются в пределах исходного операнда. Этот принцип формирования результата называется арифметикой с циклическим переносом (wraparound arithmetic). Некоторые ММХ-команды в подобной ситуации действуют иначе. В случае выхода значения результата за пределы операнда, в нем фиксируется максимальное или минимальное значение. Такой принцип формирования результата называется арифметикой с насыщением (Saturation arithmetic). MMX-расширение имеет команды, которые выполняют арифметические операции с использованием обоих принципов. При этом среди них есть команды, учитывающие знаки (значения старших бит) элементов операндов. Рассмотрим на примерах, как формируются результаты в ММХ-командах сложения и вычитания, использующих принцип насыщения.

Пример 2.1. Сложение чисел (беззнаковое насыщение)

254=11111110
+
5=00000101
=
259<>11111111

Результат ММХ-сложения с беззнаковым насыщением равен 255. При сложении командами микропроцессора add и adс, использующими принцип циклического переноса, результат равен 00000011=3, а флаг сf устанавливается в 1. Это свидетельствует о факте переполнения.

Пример 2.2. Сложение чисел (знаковое насыщение)

+254=11111110

+5=00000101

=

259<>01111111

Результат ММХ-сложения со знаковым насыщением двух положительных чисел равен 127. При сложении командами микропроцессора add и adс, использующими принцип циклического переноса, результат равен 00000011=3, а флаг сf установлен в 1. Это свидетельствует о факте переполнения.

Пример 2.3. Вычитание чисел (беззнаковое насыщение)

05=00000101

-

10=00001010

=

-5<> 00000000

Пример 2.4. Вычитание чисел (знаковое насыщение)


+05=00000101
-
+10=000001010
=
-5 <> 10000000

Результат ММХ-вычитания со знаковым насыщением двух чисел равен 80h. Это минимально возможное отрицательное число размером в байт. При вычитании командами микропроцессора sub и sbb, использующими принцип циклического переноса, результат равен 11111011=-5 в дополнительном коде, а флаг cf установлен в 1. Это свидетельствует о факте воображаемого заема единицы из старшего разряда.
Подобные рассуждения относятся и к некоторым другим ММХ-командам, не являющихся арифметическими. В табл. 2.1 представлены граничные значения насыщения для всех четырех типов данных MMX-расширения.

Таблица 2.1. Граничные значения насыщения ММХ-данных

Типы ММХ-данных Диапазон граничных значений (с насыщением)
Байт без знака 0...255 (00h...0ffh)
Слово без знака 0...65535 (00h...0ffffh)
Двойное слово без знака 0...4294967295 (00000000...0ffffffffh)
Учетверенное слово без знака (0000000000000000...0ffffffffffffffffh)
Байт со знаком -128...127 (80h...7fh)
Слово со знаком -32768...32767 (8000h...7fffh)
Двойное слово со знаком -2147483648...2147483647(80000000...7fffffffh)
Учетверенное, слово со знаком (8000000000000000... 7fffffffffffffffh )

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

ММХ-команды пересылки, подобно их целочисленным аналогам, являются наиболее часто используемыми. Эти команды осуществляют доставку информации в (из) ММХ-регистры (ов). ММХ-команды пересылки работают с 32- и 64-разрядными операндами. В данную группу входят следующие команды:

movd приемник,источник— пересылка 32 битов из источника в приемник. Один из операндов, источник или приемник, но не одновременно, должен быть ММХ-регистром. Другой операнд должен быть 32-разрядным регистром или 32-разрядной ячейкой памяти;
movq приемник,источник— пересылка 64 битов из источника в приемник В отличие от команды movd, оба операнда команды movq могут быть ММХ-регистрами. Если же операнды смешанные, то один из операндов, источник или приемник, является ММХ-регистром, а другой операнд должен быть адресом 64-разрядной ячейки памяти.

Команда movd работает только с младшей половиной ММХ-регистра. Для доступа к старшей половине ММХ-регистра необходимо использовать либо сдвиг, либо команду movq. Команда movd является единственной ММХ-командой, допускающей использование в качестве операндов 32-разрядных регистров общего назначения. Это же обстоятельство является причиной того, что при использовании в качестве приемника регистра общего назначения макрокоманда movd будет работать неправильно.
Допустимые сочетания операндов для команды movd следующие:

movd mem32, rmmx
movd rmmx, mem32
movd rmmx, r32
movd r32, rmmx