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