Особенности команд 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