• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

  • Мобильный клиент нашего форума для Android гаджетов доступен в Google Play Market по этой ссылке. Клиент можно скачать с нашего форума по этой ссылке. Последняя версия МК в нашем телеграм канале вот здесь

Как сравнить 2 16-бит.числа с помощью ДЛЛ на ассемблере и Си

  • Автор темы OksanaKsu28
  • Дата начала
O

OksanaKsu28

#1
Здраствуйте!Подскажите пожалуйста где у меня ошибки здесь.
Мое задание:Для демонстрации скорости работы регистров 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 не подходит :D Ну и с метками я перебор
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(...)-а что,даже не намекнул,может,что-то с массивами?
Буду очень,очень благодарна за помощь!!!!!!!!!!!!!!!!!
 
@

@LE}{@NDER

#2
Ну во-первых: я конечно не знаток борландовского компиллера, но из кода
Код:
  for (int i=0; i<N; i++) //вот здесь,в этой функции какая-то проблемица????
if( A[i]>B[i] )
C[i] = A[i];
else
C[i]= 0;
в вижуал студии в цикле for выполнится только

Код:
  for (int i=0; i<N; i++)
if( A[i]>B[i] )
В С/С++ про скобки не стоит забывать (когда после цикла или условия цикла выполняется одна строка кода, скобки не нужны)

Код:
  for (int i=0; i<N; i++) //вот здесь,в этой функции какая-то проблемица????
{
if( A[i]>B[i] )
{ C[i] = A[i]; } //тут скобки нужны только если больше 1й строки кода
else
{ C[i]= 0; } //тут скобки нужны только если больше 1й строки кода
}
 
Вверх Снизу