АВМиС - Лабы / 7 ММХ / отчет по MMX
.docБелорусский государственный университет информатики
и радиоэлектроники
Кафедра ЭВМ
Отчет по лабораторной работе
Тема: « Изучение регистров MMX»
Выполнил:
студент группы 750501
Демидовец А.Г.
Проверил:
к.т.н., доцент __________________ Одинец Д.Н.
Минск 2009
1. Цель работы:
Изучение работы с регистрами MMX.
2. Постановка задачи:
Написать и отладить программу, которая демонстрирует использование регистров MMX процессора при выполнении математических операций.
Предусмотреть возможность ввода с клавиатуры ФИО, типа логической операции (ИЛИ-НЕ), отражения на экране дисплея текущего состояния регистров MMX.
3. Краткие теоретические сведения:
MMX (Multimedia Extensions — мультимедийное расширение) — коммерческое название дополнительного набора инструкций, выполняющих характерные для процессов кодирования/декодирования потоковых аудио/видео данных действия за одну машинную инструкцию. Впервые появился в процессорах Pentium MMX. Разработан в лаборатории Intel в Хайфе, Израиль, в первой половине 1990-х.
4. Текст программы:
#include <windows.h>
#include <conio.h>
#include <iostream>
using namespace std;
#define N 32
char* NOT_OR(char str1[], char str2[]);
void _declspec() registers(char *MMX);
int main()
{
setlocale(LC_ALL, "Russian");
char str1[N], str2[N], MMX[N];
char *arr;
int t, i;
while(1)
{
system("cls");
cout << " Реализация операции ИЛИ-НЕ!" << endl;
cout << "Меню:" << endl;
cout << "1. Ввести строки" << endl;
cout << "2. Показать содержимое регистров" << endl;
cout << "3. Выполнить операцию 'ИЛИ-НЕ'" << endl;
cout << "0. Выход из программы" << endl << endl;
cout << "Выберите действие!!!" << endl;
t=_getch();
switch(t)
{
case '1': system("cls");
cout << "Введите строку №1!" << endl;
cin >> str1;
cout << "Введите строку №2!" << endl;
cin >> str2;
break;
case '2': system("cls");
cout << "Содержание регистров:" << endl;
registers(MMX);
for (i = 0; i < N; i++)
printf("%d ", MMX[i]);
_getch();
break;
case '3': system("cls");
cout << "Результат:" << endl;
arr = NOT_OR(str1, str2);
for (i=0; i<32; i++)
{
printf("%3d(%c) ",arr[i],arr[i]);
if (i % 16 == 7 || i % 16 == 15 || i % 16 == 23) printf("\n");
}
_getch();
break;
case '0': system("cls");
cout << "Спасибо за работу!" << endl;
_getch();
return 0;
default: break;
}
}
return 0;
}
char* NOT_OR(char str1[], char str2[])
{
long d = 0;
int a, b;
int c = 0xff, i;
char* test = new char[32];
_asm{
movd mm1,c
}
for (i=0; i<32; i++)
{
a = str1[i];
b = str2[i];
_asm{
movd mm0,a
por mm0,b
pandn mm0,mm1
movd d,mm0
}
if (d < -128) test[i] = d + 320;
else test[i] = d + 192;
};
return test;
}
void _declspec(naked) registers(char *MMX)
{
_asm{
push ebp
mov ebp, esp
mov esi, [ ebp + 8 ]
movq [esi] + 0, mm0
movq [esi] + 8, mm1
movq [esi] + 16, mm2
movq [esi] + 24, mm3
pop ebp
ret
}
}
Вывод:
В данной работе были изучены методы работы с регистрами MMX.
Скриншот: