Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть1 / avmis_labs / неразобрано / 503 / Лаб_MMX / Андрейчук К.Б / mmx(x64)
.cpp//#include "stdafx.h"
#pragma once
//#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <iostream>
//#include "stdafx.h"
//#include "stdafx.h"
using namespace std;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned __int64 uint64;
#define defBufferSize 512
// Операция логического сравнения символов строки и заданного символа
void OperationLogicalAnd(wchar_t * name, wchar_t symbol);
void OperationLogicalOr(wchar_t * name, wchar_t symbol);
// Вывод x64 числа в бинарном виде
void ShowMMXStatus(uint64 mmxStatus);
// Бинарное представление символов строки
void BinaryInterpretString(wchar_t * name, ushort lenght);
int _tmain(int argc, _TCHAR* argv[])
{
wcin.imbue(locale(".866"));
wcout.imbue(locale(".866"));
wchar_t name[defBufferSize];
wchar_t operation;
wcout << L"Введите строку для обработки:" << endl;
wcin.getline(name, defBufferSize);
ushort lenght = wcslen(name);
//wcout << L"Здраствуйте, " << name << L'.';
void (* functionPointer)(wchar_t *, wchar_t);
functionPointer = NULL;
//operation = 0;
while (!functionPointer)
{
wcout << L" Введите операцию: ";
wcin >> operation;
switch (operation)
{
case L'&':
wcout << L"Выбрана операция " << operation << L'.' << endl;
functionPointer = OperationLogicalAnd;
wcin.clear();
break;
case L'|':
wcout << L"Выбрана операция " << operation << L'.' << endl;
functionPointer = OperationLogicalOr;
wcin.clear();
break;
default:
wcout << L"Операция " << operation << L" не реализована или некорректная" << endl;
break;
}
}
BinaryInterpretString(name, lenght);
wcout << endl;
wcout << L"Введите символ, которым будет участвовать в операции " << operation << L" со строкой: " << endl;
wchar_t symbol;
wcin >> symbol;
switch(operation)
{
case L'&':
OperationLogicalAnd(name, symbol);
break;
default :
OperationLogicalOr(name, symbol);
break;
}
wcout << endl << L"Результат:" << endl;
BinaryInterpretString(name, lenght);
wcout << endl;
wcout << L"Для завершения программы нажмите пожайлуста любую клавишу." << endl;
getch();
return 0;
}
void OperationLogicalAnd(wchar_t * name, wchar_t symbol)
{
ushort symbolOffset = 0,
size = wcslen(name);
uint64 mmxStatus = 0;
ushort shift = sizeof(symbol) * 8;
__asm pxor mm1, mm1;
for (uint i = 0, count = sizeof(uint64) / sizeof(ushort); i < count; i++)
{
mmxStatus <<= shift;
mmxStatus += (ushort)symbol;
}
wcout << L"Загрузка символа в mmx1:" << endl;
__asm movq mm1, mmxStatus;
ShowMMXStatus(mmxStatus);
wcout << endl << L"Выполнение операции 'И':" << endl;
while (symbolOffset < size)
{
mmxStatus = *reinterpret_cast<uint64 *>(&name[symbolOffset]);
wcout << L"Число для загрузки в mmx0:" << endl;
ShowMMXStatus(mmxStatus);
__asm
{
movq mm0, mmxStatus;
pand mm0, mm1;
movq mmxStatus, mm0;
}
wcout << endl << L"Содержание mm0 после операции:" << endl;
ShowMMXStatus(mmxStatus);
for (ushort i = 0, size = sizeof(uint64) / sizeof(wchar_t); i < size; i++)
{
name[symbolOffset + i] = mmxStatus;
mmxStatus >>= sizeof(wchar_t) * 8;
}
symbolOffset += sizeof(uint64) / sizeof(wchar_t);
wcout << endl;
}
__asm emms;
}
void OperationLogicalOr(wchar_t * name, wchar_t symbol)
{
ushort symbolOffset = 0,
size = wcslen(name);
uint64 mmxStatus = 0;
ushort shift = sizeof(symbol) * 8;
__asm pxor mm1, mm1;
for (uint i = 0, count = sizeof(uint64) / sizeof(ushort); i < count; i++)
{
mmxStatus <<= shift;
mmxStatus += (ushort)symbol;
}
wcout << L"Загрузка символа в mmx1:" << endl;
__asm movq mm1, mmxStatus;
ShowMMXStatus(mmxStatus);
wcout << endl << L"Выполнение операции 'И':" << endl;
while (symbolOffset < size)
{
mmxStatus = *reinterpret_cast<uint64 *>(&name[symbolOffset]);
wcout << L"Число для загрузки в mmx0:" << endl;
ShowMMXStatus(mmxStatus);
__asm
{
movq mm0, mmxStatus;
por mm0, mm1;
movq mmxStatus, mm0;
}
wcout << endl << L"Содержание mm0 после операции:" << endl;
ShowMMXStatus(mmxStatus);
for (ushort i = 0, size = sizeof(uint64) / sizeof(wchar_t); i < size; i++)
{
name[symbolOffset + i] = mmxStatus;
mmxStatus >>= sizeof(wchar_t) * 8;
}
symbolOffset += sizeof(uint64) / sizeof(wchar_t);
wcout << endl;
}
__asm emms;
}
void ShowMMXStatus(uint64 mmxStatus)
{
uint64 biter = 1;
for (ushort i = 0, size = sizeof(uint64) * 8; i < size; i++)
{
if (!(i % 4) && i)
wcout << L' ';
if (!(i % 8) && i)
wcout << L' ';
if (!(i % 32) && i)
wcout << endl;
wcout << (bool)(mmxStatus & biter);
biter <<= 1;
}
wcout.clear();
}
void BinaryInterpretString(wchar_t * name, ushort lenght)
{
wchar_t biner;
for (ushort i = 0; i < lenght; i++)
{
wcout << name[i];
wcout.clear();
wcout << L" : ";
biner = 1;
for (ushort j = 0, binSize = sizeof(wchar_t) * 8; j < binSize; j++)
{
if (!(j % 4) && j)
wcout << L' ';
if (!(j % 8) && j)
wcout << L' ';
wcout << (bool)(name[i] & biner);
biner <<= 1;
}
wcout << endl;
}
}