Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть1 / avmis_labs / неразобрано / 503 / Лаб_MMX / Фомин С.С / MMX / MMX / MMX
.cpp#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
# define MMX_REGISTER_QUANTITY 8
int foul=0;
// Получение значения регистра
_int64 get_register(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_register(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 res, div;
_asm{
MOVQ res,MM0
MOVQ div,MM1
}
res = res / div;
_asm{
MOVQ MM2,res
}
return true;
}
return false;
}
int main()
{
char sign[4];
int number;
int mode=0;
while(1)
{
system("cls");
for (int i=0; i<MMX_REGISTER_QUANTITY; i++)
cout << "MM" << i << ": " << get_register(i) << endl;
if (!mode)
{
cout << "First number: ";
cin>>number;
set_register(0,number);
mode++;
continue;
}
if (mode==1)
{
cout << "First number: " << get_register(0) << endl;
cout << "Sign: ";
cin>>sign;
mode++;
continue;
}
if (mode==2)
{
cout << "First number: " << get_register(0) << endl << "Sign: " << sign << endl;
cout << "Second number: ";
cin>>number;
set_register(1,number);
if (!operation(sign))
{
cout << endl <<"Unknown operation!";
getch();
mode=0;
continue;
}
mode++;
continue;
}
if (mode==3)
{
cout << get_register(0) << " " << sign << " " << get_register(1) << " = ";
if (foul==1)cout << "-";
cout << get_register(2);
getch();
foul=0;
mode=0;
continue;
}
}
return 0;
}