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

Тема в разделе "Общие вопросы по С и С++", создана пользователем OksanaKsu28, 6 фев 2009.

  1. OksanaKsu28

    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 не подходит :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(...)-а что,даже не намекнул,может,что-то с массивами?
    Буду очень,очень благодарна за помощь!!!!!!!!!!!!!!!!!
     
  2. @LE}{@NDER

    @LE}{@NDER Гость

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

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

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

Поделиться этой страницей