Скачиваний:
35
Добавлен:
15.09.2014
Размер:
5.24 Кб
Скачать
//#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;
	}
}