
- •Севастопольский национальный университЕт ядерной энергии и промышленности инструктивно-методические указания для проведения лабораторного занятия №2
- •Заведующий кафедрой кс
- •Лабораторное занятие №2
- •1Теоретический раздел
- •2.1 Модель целочисленного mmx-расширения
- •2.3 Особенности команд mmx-расширения
- •2.4 Команды пересылки
- •1.1Команды сложения и вычитания
- •1.2Команды умножения
- •1.3Команды сравнения
- •1.4 Команды логических операций
- •1.5Команды сдвига
- •1.6Команды упаковки и распаковки
- •2Порядок выполнения работы
- •4. Процедуры вычисления выражений.
- •3Содержание отчета
- •4Контрольные вопросы
2.4 Команды пересылки
ММХ-команды пересылки, подобно их целочисленным аналогам, являются наиболее часто используемыми. Эти команды осуществляют доставку информации в (из) ММХ-регистры (ов). ММХ-команды пересылки работают с 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
1.1Команды сложения и вычитания
Команды сложения делятся на две подгруппы исходя из того, как формируется результат при возникновении переполнения — по принципу насыщения или циклического переноса.
paddb | paddw | paddd приемник, источник — сложение беззнаковых упакованных байт, слов, двойных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу циклического переноса. Перенос теряется и нигде не учитывается.
paddsb | paddsw приемник, источник — сложение упакованных байт и слов со знаком. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу знакового насыщения.
paddusb | paddusw приемник, источник — сложение беззнаковых упакованных байт и слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу
psubb | psubw | psubd приемник, исто чник —вычитание беззнаковых упакованных байтов, слов, двойных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу циклического переноса, то есть так, как это делается командами sub и sbb микропроцессора. Заем из старшего разряда, естественно, теряется и нигде не учитывается.
psubusb | psubusw приемник,источник — вычитание беззнаковых упакованных байтов и слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении ситуации, когда результат вычитания получается меньше 00h (0000h), поле соответствующего байта или слова формируется по принципу беззнакового насыщения (в нем остается значение 00h (0000h)).
В качестве примера использования MMX-расширения команд процессора рассмотрим задачу нахождения суммы двух 1024-байтных векторов. Пусть, t1 и t2 – 1024-байтные массивы, nmax=1023. Классически, данная задача решалась бы следующим образом:
asm
mov ecx,nmax+1
xor esi,esi
@l:
mov al, byte ptr t1+[esi];
add al, byte ptr t2+[esi];
mov byte ptr t3+[esi],al
inc esi
loop @l
end;
Используя MMX-расширения разбиваем массивы t1,t2 и t3 на восьмерки байт и выполняем аналогичные операции:
c:=(nmax div 8)+1;
asm
mov ecx,c
xor esi,esi
@l:
movq mm0, qword ptr t1+[esi];
paddb mm0, qword ptr t2+[esi];
movq qword ptr t3+[esi],mm0
add esi,8
loop @l
emms ; Очистка стека сопроцессора.
; Обязательно в Delphi и C++ Builder
end;