Скачиваний:
34
Добавлен:
15.09.2014
Размер:
2.89 Кб
Скачать

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <iostream>
using namespace std;

void _declspec(naked) Ymnojenie(char *name, char *surname, char *result)
{
	START:	
		_asm push	ebp					
		_asm mov		ebp,esp		 
		_asm mov		esi,[ ebp + 8 ]			
		_asm mov		edi,[ ebp + 12 ]	
		
		_asm movq	mm0, [esi] + 0
		_asm movq	mm1, [esi] + 8
		_asm movq	mm2, [esi] + 16
		_asm movq	mm3, [esi] + 24

		_asm movq	mm4, [edi] + 0
		_asm movq	mm5, [edi] + 8
		_asm movq	mm6, [edi] + 16
		_asm movq	mm7, [edi] + 24

		_asm PMULLW	mm0, mm4
		_asm PMULLW	mm1, mm5
		_asm PMULLW	mm2, mm6
		_asm PMULLW	mm3, mm7
		
		_asm mov	esi,[ ebp + 16 ]
		_asm movq	[esi] + 0, mm0 
		_asm movq	[esi] + 8, mm1 
		_asm movq	[esi] + 16, mm2
		_asm movq	[esi] + 24, mm3
		
		_asm pop ebp	
		_asm ret
	
}

void _declspec(naked) GetReg(char *MMX)
{
	START:
		_asm push ebp		
		_asm mov ebp,esp	
		_asm mov esi, [ ebp + 8 ]	
		
		_asm movq	[esi] + 0, mm0 
		_asm movq	[esi] + 8, mm1 
		_asm movq	[esi] + 16, mm2
		_asm movq	[esi] + 24, mm3
		_asm movq	[esi] + 32, mm4 
		_asm movq	[esi] + 40, mm5 
		_asm movq	[esi] + 48, mm6
		_asm movq	[esi] + 56, mm7
		
		_asm pop ebp			
		_asm ret
}

///////////////////////////MAIN
int main()
{
	while(1)
	{
		system("cls");
		printf("Operation:\ny - ymnojit'\nv - viev registrs MMX\ne - exit\n");
		char c=getch();
		int i;
		switch(c)
       	{
			case 'y':
					char str1[32], str2[32], str[32];
					//str1=new char[32];
					//memcmp(str1, 0, 32);
					
					int size;
					
					system("cls");
					printf("Enter first string:");
					//str1++;
					scanf("%s",&str1);
					//str1--;
					printf("Enter second string:");
					scanf("%s",&str2);
					if(strlen(str1)>strlen(str2))
						size=strlen(str1);
					else
						size=strlen(str2);
					printf("%s * %s = ",str1,str2);
						
					Ymnojenie(str1, str2, str); 
					for(i = 0; i < size; i++)
						printf("%c",str[i]);

					printf("\n\n");
					int s1,s2,s;
					s1=strlen(str1);
					s2=strlen(str2);
					s=size;
					for(i=0;i<s;i++)
					{
						if(s-i<=s1)
							printf("%4d ",str1[i]);	
						else
							printf("    ");
					}
					printf("\n");
					for(i=0;i<s;i++)
					{
						if(s-i<=s2)
							printf("%4d ",str2[i]);
						else
							printf("    ");
					}
					printf("\n----------------------\n");
					for(i=0;i<s;i++)
					{
						printf("%4d ",256+str[i]);					
					}
					getch();
					 break;
        	case 'v':
					 char reg[64];
					 system("cls");
					 printf("Registers:\n");
					 GetReg(reg);
					 int j;
					 for(i=0;i<8;i++)
					 {
					 	 printf("\nMMX%d - ",i);
					  	 for(j=0;j<8;j++)
					 		 printf("%4d ",reg[i*8+j]);
					 }
					 getch();
					 break;
		}
		if(c=='e')
			break;
	}
	return 0;
}