Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoc oko REP MOVS instrukcije

[es] :: Asembler :: Pomoc oko REP MOVS instrukcije

[ Pregleda: 3103 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
213.244.208.*

ICQ: 208550327


+14 Profil

icon Pomoc oko REP MOVS instrukcije05.11.2005. u 15:56 - pre 207 meseci
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]
EOF
 
Odgovor na temu

`and

Član broj: 32490
Poruke: 776
213.244.197.*

Sajt: www.bitbyterz.org


Profil

icon Re: Pomoc oko REP MOVS instrukcije05.11.2005. u 21:55 - pre 207 meseci
Nisam bas strucan ali mozda ima veze sa cuvanjem ebp\esp registra ...
 
Odgovor na temu

stameni
Ivan Stamenković

Član broj: 6739
Poruke: 494



+9 Profil

icon Re: Pomoc oko REP MOVS instrukcije06.11.2005. u 11:47 - pre 207 meseci
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.
 
Odgovor na temu

stanks
RH

Član broj: 12628
Poruke: 34
*.adsl.net.t-com.hr.



Profil

icon Re: Pomoc oko REP MOVS instrukcije06.11.2005. u 22:01 - pre 207 meseci
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
 
Odgovor na temu

the black forest

Član broj: 57286
Poruke: 7
*.beotel.net.



Profil

icon Re: Pomoc oko REP MOVS instrukcije08.11.2005. u 00:36 - pre 207 meseci
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...
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
213.244.208.*

ICQ: 208550327


+14 Profil

icon Re: Pomoc oko REP MOVS instrukcije08.11.2005. u 13:55 - pre 207 meseci
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]
EOF
 
Odgovor na temu

DreamsInDarkness

Član broj: 56757
Poruke: 30
*.ptt.yu.



Profil

icon Re: Pomoc oko REP MOVS instrukcije08.11.2005. u 15:39 - pre 207 meseci
Malo sam zapostavio asm.... Probaj da umesto lea koristis mov. I ne znam sta predstavlja problem taj cld??? Mislim da je u redu.
 
Odgovor na temu

[es] :: Asembler :: Pomoc oko REP MOVS instrukcije

[ Pregleda: 3103 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.