O
OksanaKsu28
Здраствуйте!Подскажите пожалуйста где у меня ошибки здесь.
Мое задание:Для демонстрации скорости работы регистров MMX написать две программы, реализующие одинаковую логику и выводящие время своей работы. Сравнить скорость работы программ, написанных на «чистом» Си и с использованием ассемблера.Ассемблерная команда-Сравнение,16 бит,uns – число без знака.
Вот у меня код на Си
[codebox]TForm1 *Form1;
unsigned __int16 A[10000], B[10000], C[10000], D[10000];
int ec;
HINSTANCE hinst;
void (*EQ_ams)(unsigned __int16 *,unsigned __int16 *,unsigned __int16 *, long int);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hinst=LoadLibrary("MMX.dll");
EQ_ams=(void (*)(unsigned __int16 *,unsigned __int16 *,unsigned __int16 *, long int))
GetProcAddress(hinst, MAKEINTRESOURCE(1));
}
//---------------------------------------------------------------------------
void rnd_bcb(int count)
{
randomize();
for (int i=0; i<count ; i++)
{
A=random(100);
B=random(100);
}
}
void EQ_bcb(unsigned __int16 * A,unsigned __int16 * B,unsigned __int16 * C, long int N)
{
for (int i=0; i<N ; i++) //вот здесь,в этой функции какая-то проблемица????
if( A>B )
C = A ;
else
C= 0;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int T_bcb, t_asm;
int j;
char tmsg[20];
char str[50];
Memo1->Lines->Clear();
ec=10000;
rnd_bcb(ec);
T_bcb = GetTickCount();
for(j=0; j<4000; j++)
EQ_bcb(A,B,C,ec);
T_bcb = GetTickCount() - T_bcb;
sprintf(tmsg," %4i ",T_bcb);
t_asm = GetTickCount();
for(j=0; j<4000; j++)
EQ_ams(A,B,D,ec);
t_asm = GetTickCount() - t_asm;
sprintf(str,"C++ %s \nASM %4i \nk = %3.2d",tmsg,t_asm, T_bcb/t_asm);
Label1->Caption = str;
sprintf(str,"%4s %4s %4s %4s"," A"," B", " C++", " asm");
Memo1->Lines->Add(str);
for(int i=0; i<8; i++)
{
sprintf(str,"%4i %4i %4i %4i",A,B, C, D);
Memo1->Lines->Add(str);
}
}[/codebox]
А еще код на ассемблере тоже не то:
Код Ассемблерной ДЛЛ:
[codebox].586
.XMM
.MODEL FLAT
PUBLIC _eqf@12
.CODE
_start@12:
mov al, 1
ret 12
_eqf@12 PROC
push ebp
mov ebp, esp
mov esi, [ebp + 8] ; в источник A
mov edi, [ebp + 12] ; в источник B
mov ecx, [ebp + 16] ; в приемник C
mov eax, [ebp + 20] ; в размер массива
the_loop:
movq mm0, [esi] ; A
movq mm1, [edi] ; B
cmp mm0,mm1; ;здесь вместо cmp я знаю нужно что-то другое,т.к. для регистров MMX не подходит Ну и с метками я перебор
jg then
endif:
then:
movq [ecx], mm0 ; mm0
endif:
add esi, 8 ; источник A
add edi, 8 ; источник B
add ecx, 8 ; приемник C
sub eax, 4 ; счетчик
jnz the_loop
emms
pop ebp
ret
_eqf@12 ENDP
END _start@12
[/codebox]
Мне преподаватель сказал,что у меня в Си нужно изменить функцию EQ_bcb(...)-а что,даже не намекнул,может,что-то с массивами?
Буду очень,очень благодарна за помощь!!!!!!!!!!!!!!!!!
Мое задание:Для демонстрации скорости работы регистров MMX написать две программы, реализующие одинаковую логику и выводящие время своей работы. Сравнить скорость работы программ, написанных на «чистом» Си и с использованием ассемблера.Ассемблерная команда-Сравнение,16 бит,uns – число без знака.
Вот у меня код на Си
[codebox]TForm1 *Form1;
unsigned __int16 A[10000], B[10000], C[10000], D[10000];
int ec;
HINSTANCE hinst;
void (*EQ_ams)(unsigned __int16 *,unsigned __int16 *,unsigned __int16 *, long int);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hinst=LoadLibrary("MMX.dll");
EQ_ams=(void (*)(unsigned __int16 *,unsigned __int16 *,unsigned __int16 *, long int))
GetProcAddress(hinst, MAKEINTRESOURCE(1));
}
//---------------------------------------------------------------------------
void rnd_bcb(int count)
{
randomize();
for (int i=0; i<count ; i++)
{
A=random(100);
B=random(100);
}
}
void EQ_bcb(unsigned __int16 * A,unsigned __int16 * B,unsigned __int16 * C, long int N)
{
for (int i=0; i<N ; i++) //вот здесь,в этой функции какая-то проблемица????
if( A>B )
C = A ;
else
C= 0;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int T_bcb, t_asm;
int j;
char tmsg[20];
char str[50];
Memo1->Lines->Clear();
ec=10000;
rnd_bcb(ec);
T_bcb = GetTickCount();
for(j=0; j<4000; j++)
EQ_bcb(A,B,C,ec);
T_bcb = GetTickCount() - T_bcb;
sprintf(tmsg," %4i ",T_bcb);
t_asm = GetTickCount();
for(j=0; j<4000; j++)
EQ_ams(A,B,D,ec);
t_asm = GetTickCount() - t_asm;
sprintf(str,"C++ %s \nASM %4i \nk = %3.2d",tmsg,t_asm, T_bcb/t_asm);
Label1->Caption = str;
sprintf(str,"%4s %4s %4s %4s"," A"," B", " C++", " asm");
Memo1->Lines->Add(str);
for(int i=0; i<8; i++)
{
sprintf(str,"%4i %4i %4i %4i",A,B, C, D);
Memo1->Lines->Add(str);
}
}[/codebox]
А еще код на ассемблере тоже не то:
Код Ассемблерной ДЛЛ:
[codebox].586
.XMM
.MODEL FLAT
PUBLIC _eqf@12
.CODE
_start@12:
mov al, 1
ret 12
_eqf@12 PROC
push ebp
mov ebp, esp
mov esi, [ebp + 8] ; в источник A
mov edi, [ebp + 12] ; в источник B
mov ecx, [ebp + 16] ; в приемник C
mov eax, [ebp + 20] ; в размер массива
the_loop:
movq mm0, [esi] ; A
movq mm1, [edi] ; B
cmp mm0,mm1; ;здесь вместо cmp я знаю нужно что-то другое,т.к. для регистров MMX не подходит Ну и с метками я перебор
jg then
endif:
then:
movq [ecx], mm0 ; mm0
endif:
add esi, 8 ; источник A
add edi, 8 ; источник B
add ecx, 8 ; приемник C
sub eax, 4 ; счетчик
jnz the_loop
emms
pop ebp
ret
_eqf@12 ENDP
END _start@12
[/codebox]
Мне преподаватель сказал,что у меня в Си нужно изменить функцию EQ_bcb(...)-а что,даже не намекнул,может,что-то с массивами?
Буду очень,очень благодарна за помощь!!!!!!!!!!!!!!!!!