Метода по 10 лабе (Лаб практикум) / Задания
.doc1. Скалярное произведение векторов. Эта операция часто используется в приложениях линейной алгебры и цифровой обработки сигналов.
Скалярное произведение a·b векторов ak и bk (k = 1,..., n) вычисляется так:
a·b = a1b1 + a2b2 + ... + anbn
С помощью MMX-команд можно быстро вычислять скалярное произведение векторов. Пусть векторы состоят из 16-разрядных слов и находятся в памяти по адресам a_vector и b_vector. Программа будет выполнять следующие шаги:
-
Скопировать 4 слова первого вектора в MMX-регистр командой movq.
-
Скопировать 4 слова второго вектора в MMX-регистр.
-
Попарно перемножить слова и сложить первое произведение со вторым, а третье с четвертым, пользуясь командой pmaddwd.
-
Добавить результаты шага 3 к ранее накопленным суммам командой paddd.
-
Повторить эти шаги для всех слов исходных векторов.
-
Сохранить частичные суммы в MMX-регистре.
-
Выполнить сдвиг результата вправо с помощью команды psrlq.
-
Сложить сохраненные частичные суммы с результатм последнего шага с помощью команды paddd.
-
Поместить результат в память, используя команду movd.
Задание №1. Реализуйте функцию, которая принимает в качестве параметров адреса двух векторов и количество элементов векторов. Функция возвращает скалярное произведение этих векторов.
2. Условный выбор фрагмента изображения. MMX-команды помогают разрабатывать более эффективные программы компьютерной графики и обработки видеоизображений, во многих случаях позволяя избежать условных переходов. Например, для выделения графического объекта и наложения его на неоднородный фон можно воспользоваться следующими командами:
-
Сформировать маску сравнением цвета точек верхней картинки с синим цветом командой pcmpeqb.
-
Командой pand присвоить значение 0 всем точкам сцены, на которые будет наложен объект «Герой».
-
Командой pandn присвоить значение 0 всем синим точкам исходной картинки с «Героем».
-
Выполнить наложение точек объекта на фон командой por.
Объект «Герой» |
Фон |
Результат наложения |
|
|
|
Программа обрабатывает восемь точек в каждом изображении. Для наложения всего объекта на фон данный фрагмент надо выполнить в цикле для всех точек изображения.
-
Команда pcmpeqb формирует маску: точки, соответствующие «Герою» заполняются нулями, а окружающие точки – единицами.
-
Команда pand присваивает значение 0 всем точкам фона, на которые попадет «Герой».
-
Команда pandn присваивает значение 0 всем синим точкам картинки с «Героем».
-
Команда por выполняет наложение «Героя» на фон.
Задание №2. Сформируйте файлы с произвольной картинкой и файл с некоторым фрагментом на однородном фоне, выполненные символами псевдографики. Размеры файлов должны быть кратны 8 и совпадать. Напишите программу, которая читает эти файлы в память, выполняет наложение фрагмента на картинку и записывает результат в другой файл.
3. Распаковка с «размножением» знакового бита. Часто бывает нужно преобразовать короткие данные в более длинные. Если это слова без знака, можно воспользоваться одной из команд группы punpck, позаботившись, чтобы в старшие разряды результатов сразу попали нули. Если же надо повысить разрядность слов со знаком, можно действовать следующим образом:
-
Распаковать слова из младших 32 разрядов командой punpcklwd, так, чтобы знаковый бит попал в самый старший разряд двойного слова-результата (см. рисунок).
-
Распаковать слова из старших 32 разрядов командой punpckhwd (в другой регистр).
-
Выполнить арифметический сдвиг полученных двойных слов направо командой psrad. При этом знаковый бит в каждом слове размножится, и 32-разрядные слова со знаком будут иметь те же численные значения, что и исходные 16-разрядные слова со знаком.
Задание №3. Написать функцию на языке С, которая получает в качестве параметров адрес вектора слов, адрес вектора двойных слов и количество элементов в них. Функция преобразовывает слова первого вектора в двойные слова и помещает результат во второй вектор.
4. Абсолютные величины разностей. Абсолютные величины разностей чисел используются как мера различия в алгоритмах сжатия и распознавания. MMX-команды помогут Вам быстро вычислять эти величины. Идея программы проста:
-
Скопировать элементы исходных векторов из памяти в MMX-регистры командой movq.
-
Вычесть элементы второго вектора из элементов первого в арифметике с насыщением, рассматривая их как числа без знака. Если разность отрицательна, соответствующий элемент выходного операнда станет равным нулю; если разность положительна, она попадет в выходной операнд.
-
Таким же образом вычесть элементы первого вектора из элементов второго. Там, где в предыдущем случае получились нули, теперь будут неотрицательные разности.
-
Вычислить поразрядное логическое ИЛИ от результатов шагов 2 и 3. При этом из каждой пары элементов данных на входе ИЛИ в выходной операнд попадет тот, который не равен нулю. Это и требовалось.
Задание №4. Написать функцию на языке С, которая получает в качестве параметров адреса трех векторов. Функция вычисляет абсолютные величины разностей элементов первых двух векторов и помещает результат в третий.
5. Реализация быстрого наложения картинки (спрайта) на другую. Байты изображения складываются с уже имеющимися байтами на другом изображении:
movd mm0,[edi] ; загрузка четырех байт из изображения
movd mm1,[ebx] ; загрузка четырех байт спрайта
paddusb mm0,mm1 ; сложение их с проверкой переполнения на 255
movd [edi],mm0 ; поместить эти четыре байта обратно в изображение
add ebx,4 ; следующие байты спрайта
add edi,4 ; следующие байты изображения
Задание №5. Сформируйте BMP-файлы с произвольной картинкой и файл с некоторым фрагментом на однородном фоне. Размеры файлов должны быть кратны 8 и совпадать. Напишите программу, которая читает эти файлы в память, выполняет наложение фрагмента на картинку и записывает результат в другой файл.
6. Вывод картинки (спрайтов) с прозрачностью. Вывод только тех байтов, чьи значения не равны константе прозрачности (этот метод используется практически во всех современных 2D-играх).
pxor mm2,mm2 ; обнуляем регистр mm2
movd mm0,[ebx] ; загрузка четырех байт спрайта
movd mm1,[esi] ; загрузка четырех байт фона
pcmpeqb mm2,mm0 ; делаем маску тех байт которые надо вывести
pand mm2,mm1 ; обнуляем ненужные
por mm1,mm0 ; складываем их с нашими байтами спрайта
movd [esi],mm1 ; кладем их обратно на изображение
add ebx,4
add esi,4
Задание №6. Сформируйте BMP-файлы с произвольной картинкой и файл с некоторым фрагментом на однородном фоне. Размеры файлов должны быть кратны 8 и совпадать. Напишите программу, которая читает эти файлы в память, выполняет наложение фрагмента на картинку и записывает результат в другой файл.