Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть1 / avmis_labs / неразобрано / 503 / Лаб_MMX / Белорусец / MMX
.cpp#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;
}