Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 6 odgovora
  • 4.032 pregleda

Najnovija ↓

Pomoc oko REP MOVS instrukcije 05.11.2005. u 16:56 · pre 255 meseci
izmenjeno 1 put, poslednji put glorius 05.11.2005. u 18:41
  1. glorius05.11.2005. u 18:41zapis iz teksta poruke
#1
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...
Potpis
EOF
Re: Pomoc oko REP MOVS instrukcije 06.11.2005. u 12:47 · pre 255 meseci #3
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.
Re: Pomoc oko REP MOVS instrukcije 06.11.2005. u 23:01 · pre 255 meseci #4
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
Re: Pomoc oko REP MOVS instrukcije 08.11.2005. u 14:55 · pre 255 meseci
izmenjeno 1 put, poslednji put glorius 08.11.2005. u 14:56
  1. glorius08.11.2005. u 14:56zapis iz teksta poruke
#6
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 )...
Potpis
EOF
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme