Скачиваний:
34
Добавлен:
15.09.2014
Размер:
3.17 Кб
Скачать
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;

# define MMX_REGISTER_QUANTITY 8
int foul=0;

// Получение значения регистра
_int64 get(int number)
{
_int64 result=0;
switch(number)
{
	case 0:
		_asm{MOVQ  result,MM0} 
		break;
	case 1:
		_asm{MOVQ  result,MM1} 
		break;
	case 2:
		_asm{MOVQ  result,MM2} 
		break;
	case 3:
		_asm{MOVQ  result,MM3} 
		break;
	case 4:
		_asm{MOVQ  result,MM4} 
		break;
	case 5:
		_asm{MOVQ  result,MM5} 
		break;
	case 6:
		_asm{MOVQ  result,MM6} 
		break;
	case 7:
		_asm{MOVQ  result,MM7} 
		break;
}
return result;
}

// Занесение значения в регистр
void set(int number, _int64 value)
{
switch(number)
{
	case 0:
		_asm{MOVQ  MM0,value} 
		break;
	case 1:
		_asm{MOVQ  MM1,value} 
		break;
	case 2:
		_asm{MOVQ  MM2,value} 
		break;
	case 3:
		_asm{MOVQ  MM3,value} 
		break;
	case 4:
		_asm{MOVQ  MM4,value} 
		break;
	case 5:
		_asm{MOVQ  MM5,value} 
		break;
	case 6:
		_asm{MOVQ  MM6,value} 
		break;
	case 7:
		_asm{MOVQ  MM7,value} 
		break;
}
}

bool operation (char* symbol)
{
int sp_save;
_int64 null=0;

if (!strcmp(symbol,"+")||!strcmp(symbol,"ADD"))
{
_asm{
	MOVQ  MM2,MM0
	PADDQ  MM2,MM1
}
return true;
}	

if (!strcmp(symbol,"-")||!strcmp(symbol,"SUB"))
{
_asm{
	mov  sp_save,esp
	MOVQ  MM2,MM0
	PCMPGTD  MM2,MM1
	MOVD  eax,MM2
	cmp eax,0
	je EXC
	MOVQ  MM2,MM0
	PSUBQ  MM2,MM1
	call QUIT
	EXC:
	mov  eax,1
	mov  foul,eax
	MOVQ  MM2,MM1
	PSUBQ  MM2,MM0
	QUIT:
	mov  esp,sp_save
}
return true;
}

if (!strcmp(symbol,"*")||!strcmp(symbol,"MUL"))
{
_asm{
	mov  sp_save,esp
	MOVQ  MM4,MM0
	MOVQ  MM5,MM1

	MOVQ  MM2,MM4
	PCMPGTD  MM2,null
	MOVD  eax,MM2
	cmp eax,0
	je EXC2
	call CONT
	EXC2:
	mov  eax,foul
	add  eax,1
	mov  foul,eax
	MOVQ  MM2,MM4
	MOVQ  MM4,null
	PSUBQ  MM4,MM2

	CONT:
	MOVQ  MM2,MM5
	PCMPGTD  MM2,null
	MOVD  eax,MM2
	cmp eax,0
	je EXC3
	call CONT2
	EXC3:
	mov  eax,foul
	add  eax,1
	mov  foul,eax
	movq  MM2,MM5
	MOVQ  MM5,null
	PSUBQ  MM5,MM2

	CONT2:
	MOVQ  MM2,MM4
	PMADDWD  MM2,MM5
	mov  esp,sp_save
}
return true;
}

if (!strcmp(symbol,"/"))
{
_int64 result, divident;
_asm{
	MOVQ  result,MM0
	MOVQ  divident,MM1
}
if(divident==0) return false;
result/=divident;
_asm{
	MOVQ  MM2,result
}
return true;

}
return false;
}


int main()
{
char * sign;

int number;
int mode=0;
char * expression;
expression = (char*)calloc(256,sizeof(char));
sign = (char*)calloc(2,sizeof(char));

while(1)
{
	system("cls");

	for (int i=0; i<MMX_REGISTER_QUANTITY; i++)
	printf("MMX%d : %11d  ",i,get(i));


	cout << "expression: "; 
	gets(expression);

	set(0,atoi(expression));
	while(isdigit(expression[0])) expression++;
	sign[0] = expression[0];


	expression++;

	set(1,atoi(expression));


	if (!operation(sign)) 
	{
		cout << endl <<"user invalid"; 
		getch();
		mode=0; 
		continue;
	}


	cout << get(0) << " " << sign << " " << get(1) << " = ";
	if (foul==1)cout << "-";
	cout << get(2); 
	getch(); 
	foul=0; 
	mode=0; 
	continue;

}

	return 0;
}