Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть1 / avmis_labs / лабы / 7 ММХ / avm
.cpp#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
}
test[i] = d;
};
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
}
}