[ 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] |