for (i = Width - 1; i >= 0; i--) { *((unsigned short int *)ptrDest) = *((unsigned short int *)brgb); ptrDest++; ptrDest++; *ptrDest++ = brgb[2]; }
:004243E2 8B75FC mov esi, dword ptr [ebp-04] ; esi = i :004243E5 4E dec esi :004243E6 85F6 test esi, esi :004243E8 7C38 jl 00424422 :004243EA 668B02 mov ax, word ptr [edx] ; edx = brgb :004243ED 4E dec esi :004243EE 668903 mov word ptr [ebx], ax ; ebx = ptrDest :004243F1 43 inc ebx :004243F2 43 inc ebx :004243F3 8A4A02 mov cl, byte ptr [edx+02] :004243F6 880B mov byte ptr [ebx], cl :004243F8 43 inc ebx :004243F9 85F6 test esi, esi :004243FB 7DED jge 004243EA
for (i = Width - 1; i >= 0; i--) { *ptrDest = brgb[0]; ptrDest++; *ptrDest = brgb[1]; ptrDest++; *ptrDest = brgb[2]; ptrDest++; }
:00424424 8B75FC mov esi, dword ptr [ebp-04] ; esi = i :00424427 4E dec esi :00424428 85F6 test esi, esi :0042442A 7C16 jl 00424442 :0042442C 8A02 mov al, byte ptr [edx] ; edx = brgb :0042442E 4E dec esi :0042442F 8803 mov byte ptr [ebx], al ; ebx = ptrDest :00424431 43 inc ebx :00424432 8A4A01 mov cl, byte ptr [edx+01] :00424435 880B mov byte ptr [ebx], cl :00424437 43 inc ebx :00424438 8A4202 mov al, byte ptr [edx+02] :0042443B 8803 mov byte ptr [ebx], al :0042443D 43 inc ebx :0042443E 85F6 test esi, esi :00424440 7DEA jge 0042442C
i = Width - 1; do { *((unsigned short int *)ptrDest) = *((unsigned short int *)brgb); ptrDest++; ptrDest++; *ptrDest++ = brgb[2]; i--; }while(i >= 0);
:00424388 8B75F8 mov esi, dword ptr [ebp-08] ; [ebp-08] = Width :0042438B 4E dec esi ; i = Width - 1; :0042438C 8D55F5 lea edx, dword ptr [ebp-0B] :0042438F 4E dec esi ; i-- :00424390 668B12 mov dx, word ptr [edx] :00424393 668913 mov word ptr [ebx], dx ; *((unsigned short int *)ptrDest) = *((unsigned short int *)brgb) :00424396 43 inc ebx ; ptrDest++ :00424397 43 inc ebx ; ptrDest++ :00424398 8A55F7 mov dl, byte ptr [ebp-09] :0042439B 8813 mov byte ptr [ebx], dl ; *ptrDest++ = brgb[2] :0042439D 43 inc ebx :0042439E 85F6 test esi, esi :004243A0 7DEA jge 0042438C
register const int pd = iPixelAdd + 2; i = Width - 1; do { *ptrDest++ = brgb[0]; *((unsigned short int *)ptrDest) = *((unsigned short int *)&brgb[1]); ptrDest += pd; i--; }while(i >= 0);
:004243A4 8D7802 lea edi, dword ptr [eax+02] ; edi = pd :004243A7 8B75F8 mov esi, dword ptr [ebp-08] :004243AA 4E dec esi ; i = Width - 1 :004243AB 8A55F5 mov dl, byte ptr [ebp-0B] :004243AE 4E dec esi ; i-- :004243AF 8813 mov byte ptr [ebx], dl ; *ptrDest++ = brgb[0] :004243B1 8D55F6 lea edx, dword ptr [ebp-0A] :004243B4 43 inc ebx :004243B5 668B12 mov dx, word ptr [edx] :004243B8 668913 mov word ptr [ebx], dx ; *((unsigned short int *)ptrDest) = *((unsigned short int *)&brgb[1]) :004243BB 03DF add ebx, edi ; ptrDest += pd :004243BD 85F6 test esi, esi :004243BF 7DEA jge 004243AB
常数完全可以放在寄存器里嘛,非要来回多次读取。
const unsigned short int igb = ((byte)(Color>>16)) | (((byte)(((WORD)Color)>>8))<<8); const byte br = (byte)Color; i = Width - 1; do { *((unsigned short int *)ptrDest) = igb; ptrDest++; ptrDest++; *ptrDest++ = br; i--; }while(i >= 0);
:0042439B 4E dec esi :0042439C 66893B mov word ptr [ebx], di ; *((unsigned short int *)ptrDest) = igb :0042439F 43 inc ebx ; ptrDest++ :004243A0 43 inc ebx ; ptrDest++ :004243A1 4E dec esi ; i-- :004243A2 8803 mov byte ptr [ebx], al ; *ptrDest++ = br :004243A4 43 inc ebx :004243A5 85F6 test esi, esi :004243A7 7DF3 jge 0042439C
这基本是最佳汇编了。
const byte bb = (byte)(Color>>16); const unsigned short int irg = ((byte)(((WORD)Color)>>8)) | ((byte)Color<<8); register const int pd = iPixelAdd + 2; i = Width - 1; do { *ptrDest++ = bb; *((unsigned short int *)ptrDest) = irg; ptrDest += pd; i--; }while(i >= 0);
:004243D3 8B75F8 mov esi, dword ptr [ebp-08] :004243D6 4E dec esi :004243D7 8A4DF3 mov cl, byte ptr [ebp-0D] ; byte ptr [ebp-0D] = bb :004243DA 4E dec esi ; i-- :004243DB 880B mov byte ptr [ebx], cl :004243DD 43 inc ebx :004243DE 668903 mov word ptr [ebx], ax :004243E1 03DF add ebx, edi ; ptrDest += pd :004243E3 85F6 test esi, esi :004243E5 7DF0 jge 004243D7