Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2011, 17:42   #1
Кристина133
 
Регистрация: 11.03.2011
Сообщений: 9
По умолчанию разный результат

задание в том что нужно найти сумму чисел матрицы двумя способами с mmx и без...я вроде написала но у меня почему то разные результаты.где ошибка?второй способ правильно работает,а первый нет!
Код:
#include "stdafx.h"


#include "stdio.h"
#include "windows.h"
int main(int argc, char* argv[])
{
	short a_array[4][4]; //матрица 4*4
short cnt = 16;  //число эл-тов
int res = 0, res1 = 0;  
int Time1, Time2, Delay1; //для хранения времени
double Speedup;
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)

{
a_array[i][j] = i*4+j;
}
printf("\nScalar product with or without MMX...\n\n");
printf("\nResult = %d\n", res);
printf("Result1 = %d\n", res1);
Time1 = GetTickCount();

for (i=0; i<10000000; i++)
{
cnt = 16;
__asm
{
push eax
push ecx
push esi
xor esi, esi
pxor MM7, MM7
loop1:
movq MM0, a_array[esi]
movq MM1, MM0
pmaddwd MM0, MM1
paddd MM7, MM0
add esi, 8
sub cnt, 4
jnz loop1
movq MM0, MM7
psrlq MM7, 32
paddd MM7, MM0
movd res, MM7
emms
pop esi
pop ecx
pop eax
}
}
Time2 = GetTickCount();

printf("\n Using MMX ...\n");
printf("\nResult = %d", res);
Delay1 = Time2 - Time1;
printf("\nTime elapsed = %d ms\n", Delay1);

Time1 = GetTickCount();

for (i=0; i<10000000; i++)
{
cnt = 16;
__asm
{
push eax
push ecx
push esi
xor esi, esi
xor ecx, ecx
loop2:
 
movsx eax, a_array[esi] 

add cx, ax
add esi, 2
sub cnt, 1
jnz loop2
mov res1, ecx
pop esi
pop ecx
pop eax
}
}
Time2 = GetTickCount();

printf("\n Without MMX ...\n");
printf("\nResult1 = %d", res1);
printf("\nTime elapsed = %d ms\n", Time2 - Time1);
Speedup = float((Time2 - Time1))/float(Delay1);
printf("\nMMX SpeedUp = %10.4f times\n\n", Speedup);
return 0;
}

Последний раз редактировалось Stilet; 13.05.2011 в 20:06.
Кристина133 вне форума Ответить с цитированием
Старый 13.05.2011, 16:01   #2
UsamaBenLadan
Пользователь
 
Аватар для UsamaBenLadan
 
Регистрация: 01.05.2011
Сообщений: 23
По умолчанию

Код:
loop1:
movq MM0,a_array[esi]
movq MM1,MM0
// преобразование WORD -> DWORD (с сохранением знака)
pshufw mm0,80 // 01010000b
pshufw mm1,250 //11111010b
psrad mm0,16
psrad mm1,16
// сложение
paddd mm0,mm1
paddd MM7,MM0
add esi,8
sub cnt,4
jnz loop1

А разве EAX и ECX нужно сохранять ?

Последний раз редактировалось Stilet; 13.05.2011 в 20:07.
UsamaBenLadan вне форума Ответить с цитированием
Старый 13.05.2011, 16:16   #3
Кристина133
 
Регистрация: 11.03.2011
Сообщений: 9
По умолчанию

так без сохранения вообще не работает!
Кристина133 вне форума Ответить с цитированием
Старый 13.05.2011, 19:15   #4
UsamaBenLadan
Пользователь
 
Аватар для UsamaBenLadan
 
Регистрация: 01.05.2011
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Кристина133 Посмотреть сообщение
так без сохранения вообще не работает!
Что за ужасный компилятор
Даже в EAX лепит регистровые переменные
UsamaBenLadan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одна и таже прога в разный IDE Faydaen Общие вопросы C/C++ 3 23.04.2010 20:51
Разный отступ маргин в ие и фаерфоксе Mike05 HTML и CSS 2 09.07.2009 16:46
СУММИРОВАНИЕ И ПОДСЧЕТ ЯЧЕЕК ОКРАШЕННЫХ В РАЗНЫЙ ЦВЕТ Arina Microsoft Office Excel 11 29.01.2009 14:35
Разный цвет фона в таблице (php) Lonix PHP 2 04.10.2008 21:39
Сборная печать с разный листов shafer Microsoft Office Excel 10 21.05.2008 22:06