Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЗ-2-MMX_.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
295.94 Кб
Скачать

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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]