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


int main()
{

	char mess_1[]="Enter string:"; 	
	char buf1[20]; //первая строка 
	char buf2[20]; //вторая строка
	unsigned _int64 _mm0; //буфер для регистра mm0
    unsigned _int64 _mm1; //буфер для регистра mm0
	unsigned _int64 _mm2; //буфер для регистра mm0
	unsigned _int64 _mm3; //буфер для регистра mm0 
	unsigned _int64 _mm4; //буфер для регистра mm0
	unsigned _int64 _mm5; //буфер для регистра mm0
	unsigned _int64 _mm6; //буфер для регистра mm0
	unsigned _int64 _mm7; //буфер для регистра mm0	

	do{
	puts(mess_1);
    gets(buf1);
    puts(mess_1);
    gets(buf2);
	size_t addr_buf1 = size_t(buf1); //считываем адрес первой строки
	size_t addr_buf2 = size_t(buf2); //считываем адрес второй строки
	_asm
	{
	mov	    ebx, addr_buf1		    //адрес первой строки в ebx
	movq	mm0, [ebx]+0        //поместить 8 байт по адресу buf1+0 в mm0	
	movq	mm1, [ebx]+8		// поместить 8 байт по адресу buf1+8 в mm1
	movq	mm2, [ebx]+16		// поместить 8 байт по адресу buf1+16 в mm2
	movq	mm3, [ebx]+24		// поместить 8 байт по адресу buf1+24 в mm3

	mov	    ebx, addr_buf2		    // адрес второй строки в ebx
	movq	mm4, [ebx]+0		// поместить 8 байт по адресу buf2+0 в mm4
	movq	mm5, [ebx]+8		// поместить 8 байт по адресу buf2+8 в mm5
	movq	mm6, [ebx]+16		// поместить 8 байт по адресу buf2+16 в mm6
	movq	mm7, [ebx]+24	    // поместить 8 байт по адресу buf2+24 в mm7

	movq _mm0,mm0          //поместить значение регистра mm0 в буфер
    movq _mm1,mm1          //поместить значение регистра mm1 в буфер
	movq _mm2,mm2          //поместить значение регистра mm2 в буфер
	movq _mm3,mm3          //поместить значение регистра mm3 в буфер
	movq _mm4,mm4          //поместить значение регистра mm4 в буфер
	movq _mm5,mm5          //поместить значение регистра mm5 в буфер
	movq _mm6,mm6          //поместить значение регистра mm6 в буфер
	movq _mm7,mm7          //поместить значение регистра mm7 в буфер
	}
    cout<<endl<<"mm0 "<<_mm0<<endl; //вывод регистра mm0
	cout<<"mm1 "<<_mm1<<endl; //вывод регистра mm1
    cout<<"mm2 "<<_mm2<<endl; //вывод регистра mm1
	cout<<"mm3 "<<_mm3<<endl; //вывод регистра mm1
	cout<<endl<<"mm4 "<<_mm4<<endl; //вывод регистра mm1
	cout<<"mm5 "<<_mm5<<endl; //вывод регистра mm1
	cout<<"mm6 "<<_mm6<<endl; //вывод регистра mm1
    cout<<"mm7 "<<_mm7<<endl<<endl; //вывод регистра mm1
	_asm{
	PSUBD	mm0, mm4	// команда вычитает элементы данных входного операнда из	
	PSUBD	mm1, mm5    // элементов данных выходного операнда. Если результат выходит за границу допустимого 
	PSUBD	mm2, mm6	//диапазона, то по правилам циклической арифметики соответствующее число единиц отсчитывается	
	PSUBD	mm3, mm7    //от другой границы диапазона. "Переноса" единицы из одного элемента данных в другой не происходит.

	movq _mm0,mm0          //поместить значение регистра mm0 в буфер
    movq _mm1,mm1          //поместить значение регистра mm1 в буфер
	movq _mm2,mm2          //поместить значение регистра mm2 в буфер
	movq _mm3,mm3          //поместить значение регистра mm3 в буфер
	}
    cout<<"mm0 "<<_mm0<<endl; //вывод регистра mm0
	cout<<"mm1 "<<_mm1<<endl; //вывод регистра mm1
    cout<<"mm2 "<<_mm2<<endl; //вывод регистра mm1
	cout<<"mm3 "<<_mm3<<endl; //вывод регистра mm1
	cout<<endl<<"mm4 "<<_mm4<<endl; //вывод регистра mm1
	cout<<"mm5 "<<_mm5<<endl; //вывод регистра mm1
	cout<<"mm6 "<<_mm6<<endl; //вывод регистра mm1
	cout<<"mm7 "<<_mm7<<endl; //вывод регистра mm1
	cout<<"continue? (y/n) ";
	fflush(stdin);
	}while(getch()=='y');
	return 0;
}