написанные программы / asm lab # 3 / lab_3
.doc-
Цель работы
Необходимо разработать программу на языке С++ с ассемблерными вставками. Программа должна осуществлять пересылку в оперативной памяти компьютера одного массива данных в другой. Эту операцию нужно реализовать следующими способами:
-
средствами языка программирования высокого уровня (C++)
-
на языке ассемблер
-
на языке ассемблер с применением технологии MMX
-
Текст программы
#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <iostream>
unsigned long timeStart;
unsigned long timeEnd;
unsigned long Num = 10485760; // число элементов массива
void CTransfer(int *ptrScr, int *ptrDst, unsigned long num);
void AsmTransfer(int *ptrScr, int *ptrDst, unsigned long num);
void MMXTransfer(int *ptrScr, int *ptrDst, unsigned long num);
int main(int argc, char* argv[])
{
int *pS = new int[Num];
int *pD = new int[Num];
int *p1, *p2;
p1 = pS;
p2 = pD;
for (unsigned long j=0; j < Num; j++)
{
*(p1+j) = 5;
*(p2+j) = 3;
}
do
{
printf("\nCTransfer:");
timeStart = clock();
CTransfer(pS, pD, Num); // Вызываем процедуру
timeEnd = clock();
printf("\nCTransfer: %.3fs", (timeEnd - timeStart)/1000.0);
printf("\n\nAsmTransfer:");
timeStart = clock();
for (int iter = 0; iter < 200; iter++)
{
AsmTransfer(pS, pD, Num);
}
timeEnd = clock();
printf("\nAsmTransfer: %.3fs", (timeEnd - timeStart)/1000.0);
printf("\n\nMMXTransfer:");
timeStart = clock();
for (int iter = 0; iter < 200; iter++)
{
MMXTransfer(pS, pD, Num);
}
timeEnd = clock();
printf("\nMMXTransfer: %.3fs", (timeEnd - timeStart)/1000.0);
printf("\nRepeat?\n");
} while (getch() == 'y');
return 0;
}
void CTransfer(int *ptrSrc, int *ptrDst, unsigned long num)
{
unsigned long i;
for (int iter = 0; iter < 100; iter++)
{
for (i = 0; i < num; i++)
{
ptrSrc[i] = ptrDst[i];
}
for (i = 0; i < num; i++)
{
ptrDst[i] = ptrSrc[i];
}
}
}
void AsmTransfer(int* ptrSrc, int* ptrDst, unsigned long num)
{
_asm
{
mov ecx, num
shr ecx,2
mov esi, ptrSrc //туда
mov edi, ptrDst
cld
rep movsd
mov ecx, num
shr ecx,2
mov esi, ptrDst //обратно
mov edi, ptrSrc
cld
rep movsd
}
}
void MMXTransfer(int* ptrSrc, int* ptrDst, unsigned long num)
{
_asm
{
mov ebx, num;
mov esi, ptrSrc;
mov edi, ptrDst;
align 16;
label:
sub ebx, 8;
movq mm0, [esi+ebx]; //туда
movq [edi+ebx], mm0; //обратно
jnz label;
emms;
}
}
3. Результаты работы программы
4. Описание использованных MMX команд
EMMS - команда обеспечивает переход процессора от исполнения MMX-команд к исполнению обычных команд с плавающей запятой: она устанавливает значение 1 во всех разрядах слова состояния.
MOVQ - команда пересылки данных из/в MMX-регистр.
-
Выводы по работе программы
Программа работает правильно, о чем говорят полученные результаты. Самая долгая пересылка это пересылка на Си, пересылка на Ассемблере происходит намноого быстрее, ну и самая быстрая пересылка с использованием технологии MMX.
Лабораторная Работа №3
“Введение в технологию MMX”
Работу выполнил
студент гр 2100
Голубцов Евгений
Работу принял
Лукьянов Н. М.
2009