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:
#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:
__asm
{
pusha;
cld;
lea esi, mem1;
lea edi, mem2;
movsd;
popa;
}
Tu fali rep instrukcija + oznacavanje koliko podataka ( bajtova, wordova, ... ) se kopira. Znaci:
__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]