Code (Text): ; in - al=byte ;out - ebx = bit field ;out - dl = al (если al (0xA0..0xAF) mov bl, al ; save al and bl, 11110000b cmp bl, 0xA0 ; 0xA0 - 0xAF jne @notA0 mov dl, al xor bl, bl jmp @next_byte @notA0: xor bl, bl xor ecx, ecx mov cl, 12 lea edi, [table_] cld repne scasb bts ebx, ecx @next_byte: table_ db 0xF0, 0xF8, 0xFC, 0x34, 0x35, 0x36, 0x37, 0x8D, 0xF2, 0x88, 0x0F, 0
ну если по скорости то можно как минимум отказаться от партиальных регистров т.к. арифметический операций нет то безболезненно =)
xor bl, bl вынести перед проверкой. и размер и скорость. xor ecx, ecx mov cl, 12 а что мешает mov ecx, 12 ?
думал, может что-нибудь с cld repne scasb bts ebx, ecx сделать. по rdtsc проходит за 240 тиков, а без этого всего за 60.
ну да достаточно тормозные конструкции... как самый очевидный вариант =) @@: mov dl, [edi] inc edi inc ecx cmp al, dl jnz @B mov edx, 1 shl edx, cl or ebx, edx test ebx, edx
пробовал cmp ... + sub ecx... + ... получается вообще >400. table_ маленькая, может можно без неё обойтись
Code (Text): mov eax, 0x0F mov bl, al ; save al and bl, 11110000b cmp bl, 0xA0 ; 0xA0 - 0xAF jne @notA0 mov dl, al xor bl, bl jmp @next_byte @notA0: mov ecx, 11 ;12 mov edi, table_ xor bl, bl @@: mov dl, [edi] inc edi dec ecx jz @next_byte cmp al, dl jne @B bts ebx, ecx @next_byte: xor dl, dl table_ db 0xF0, 0xF8, 0xFC, 0x34, 0x35, 0x36, 0x37, 0x8D, 0xF2, 0x88, 0x0F, 0 этот код выполняется за 180 тиков. n0name меняю mov dl, edi + cmp dl, al на cmp al, [edi] - 320!
bts это отстой Code (Text): ; in - al=byte ;out - ebx = bit field ;out - dl = al (если al (0xA0..0xAF) mov dl, al ; save al and al, 0xF0 cmp al, 0xA0 ; 0xA0 - 0xAF je @next_byte mov ecx,11 ;12 ? lea edi,[ecx+table_] mov ebx,1 ;или lea ebx,[ecx-10] для мелочной экономии размера ;) neg ecx ;align 16 @notA0: cmp dl,[edi+ecx] jz @found add ebx,ebx ;=shl ebx,1 add ecx,1 jnz @notA0 @nextbyte: xor ebx,ebx @found: ;mov al,dl ;если нужно сохранить al table_ db ... ;<инвертировать в обратном порядке по сравн. c bts ebx,ecx>