[ glorius @ 05.11.2005. 15:56 ] @
Radim u MASM ( RADAsm okruzenje ) i koristim Art of Programming knjigu iz koje je uzet sledeci primer:

Code:

                cld                           // cistimo direction flag
                lea     si, String1         // source
                lea     di, String2         // dest
                mov     cx, 384           // broj bajtova
        rep    movsw                      // COPY
                 


Ovaj kod kopira 384 bajtova iz Stringa1 u String2.
Sve radi ok.

Ovo sam zeleo da primenim u VC++ okruzenju ali desavaju se neke cudne stvari

Evo C++ koda:

Code:


#define COUNT 1000000                                           // broj clanova za kopiranje

int main(int argc, char* argv[])
{
    int first, last;      // ovo koristim za merenje neke operacije

    int * mem1 = new int[COUNT];      
    int * mem2 = new int[COUNT];

    
    for(int i=0;i<COUNT;i++)       // i ovo sam pokusao preko stos ali ne radi
    {
        mem1[i] = 50;
        mem2[i] = 0;
    }
    
    first = GetTickCount();

/////////Ovo sto bi memcpy uradio:  memcpy(mem2, mem1, COUNT*sizeof(int)); // 
    
///////// Uradio sam u asm ///////////////
    __asm
    {
        pusha;
        cld;
        lea esi, mem1;
        lea edi, mem2;
        movsd;
        popa;
    }
    
    last = GetTickCount();  // koliko se vremena utrosilo na kopiranje

    for(int k=0;k<100;k++)
        cout << mem1[k] << "           " << mem2[k] << endl;

    char txt[255];
    sprintf(txt, "Time spent: %d \n", last - first);

    cout << txt;
    return 0;
}




Ovo lepo radi i mnooogo je brze od memcpy ali pogledajte ovaj deo koda:

Code:


__asm
    {
        pusha;
        cld;
        lea esi, mem1;
        lea edi, mem2;
        movsd;
        popa;
    }



Tu fali rep instrukcija + oznacavanje koliko podataka ( bajtova, wordova, ... ) se kopira. Znaci:

Code:


__asm
    {
        pusha;
        cld;
        lea esi, mem1;
        lea edi, mem2;
                          mov ecx, COUNT;
        rep movsd;
        popa;
    }


Ovo bi bilo pravilno ali mi prijavljuje Illegal bla bla ...

Sta nije u redu?
Da li VC++ uopste koristi brojac ili sam prepozna koliko puta treba da ponovo ( rep ) operaciju ili...




[Ovu poruku je menjao glorius dana 05.11.2005. u 18:41 GMT+1]
[ `and @ 05.11.2005. 21:55 ] @
Nisam bas strucan ali mozda ima veze sa cuvanjem ebp\esp registra ...
[ stameni @ 06.11.2005. 11:47 ] @
Citat:


Code:


cld                           // cistimo direction flag

lea     si, String1         // source

lea     di, String2         // dest

mov     cx, 384           // broj bajtova

rep    movsw                      // COPY




Ovaj kod kopira 384 bajtova iz Stringa1 u String2.




384 reči (movsw).


Mislim da je pravi problem što nisi postavio DS:SI i ES:DI (to zahtevaju instrukcije sa prefiksom rep). Opet, čak i da probaš postaviš, teško će modifikacija segmentnih registara proći kod 32-bitnog OS-a.


Ako si u prilici, isprobaj program pod nekim DOS C-kompajlerom.


Za Win32 programiranje preporučuju tutorijal Iczeliona (ili tako nekako...), trebalo bi da imaš link u jednoj od TOP tema.
[ stanks @ 06.11.2005. 22:01 ] @
std i cld se koriste u paru. Dakle sa std postavljas "direction flag", a sa cld ga mices. Mozda je u tome problem? Nisam nikad probao koristiti samo cld (bez std), tako da ne znam. Tu bi mogao biti problem isto kao i da umjesto para funkcija pusha/popa koristis samo popa. Probaj, nista te ne kosta :)

stanks
[ the black forest @ 08.11.2005. 00:36 ] @
std i cld imaju potpuno drugaciju namenu isto kao kad bi reko moras prvo clc pa stc da koristis da bi ti adc i sbb radili...
[ glorius @ 08.11.2005. 13:55 ] @
Ne znam bas mnogo asembler ali cini mi se da cld postavlja direction flag na nulu da bi movs inkrementirao esi i edi pri kopiranju podataka ( u ovom slucaju )...

[Ovu poruku je menjao glorius dana 08.11.2005. u 14:56 GMT+1]
[ DreamsInDarkness @ 08.11.2005. 15:39 ] @
Malo sam zapostavio asm.... Probaj da umesto lea koristis mov. I ne znam sta predstavlja problem taj cld??? Mislim da je u redu.