Скачиваний:
11
Добавлен:
09.05.2014
Размер:
68.61 Кб
Скачать
  1. Цель работы

Необходимо разработать программу на языке С++ с ассемблерными вставками. Программа должна осуществлять пересылку в оперативной памяти компьютера одного массива данных в другой. Эту операцию нужно реализовать следующими способами:

  • средствами языка программирования высокого уровня (C++)

  • на языке ассемблер

  • на языке ассемблер с применением технологии MMX

  1. Текст программы

#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-регистр.

    1. Выводы по работе программы

Программа работает правильно, о чем говорят полученные результаты. Самая долгая пересылка это пересылка на Си, пересылка на Ассемблере происходит намноого быстрее, ну и самая быстрая пересылка с использованием технологии MMX.

Лабораторная Работа №3

“Введение в технологию MMX”

Работу выполнил

студент гр 2100

Голубцов Евгений

Работу принял

Лукьянов Н. М.

2009

Соседние файлы в папке asm lab # 3