Задача: преоброзовать dword в ASCII представлние. Т.е. например: in: 0x00786F72 (хм.. почему именно этот дворд пришел в голову^^) out: 0x30, 0x30, 0x37, 0x38, 0x36, 0x46, 0x37, 0x32 Решение на асме: Код (Text): __asm{ push ecx mov ecx, 4 lea esi, dwIn add esi, 3 mov edi, strOut loop1: dec ecx js fin movzx eax, byte ptr [esi] rol eax, 4 ror al, 4 cmp ah, 9 jbe digit add ah, 7 digit: add ah, 30h mov [edi], ah cmp al, 9 jbe digit2 add al, 7 digit2: add al, 30h mov [esi+1], al add edi, 2 dec esi jmp loop1 fin: mov byte ptr [edi],0 pop ecx }; (с) Bitfry & me Мое решение на це: Код (Text): void DW2STR ( DWORD dwIn, CHAR* strOut){ BYTE b; int i; for( i=0; i<8; i++ ) { b = ( dwIn >> 28-(i*4) ); b &= 0x0F; if ( b <= 9 ) b += 0x30; else b += 0x37; // digit +0x30, A-F +0x37 *( BYTE* )( strOut+i ) = b; }; } Студия компелирует без цикла и это понятно. Интересно более красивое решение, а именно со сдвигом _одного_ байта влево. Т.о. можно сократить кол-во проходов вдвое. Фактически, как на це скомпелировать аналог "rol eax, 4; ror al, 4". Может я просто не знаю. Кому нечего делать, ваши решения в студию (вижуал студию всмсле) ) з.ы. интересно именно с помощью операций сдвига.
censored Да, только вот что получается: Код (Text): b = (dwIn >> 28-(i*4)); b = _lrotl( b, 4 ); w = _lrotr( b, 4 ); *(WORD*)(strOut) = w; даёт: Код (Text): shr eax, 18 rol eax, 4 movzx ecx, al ror ecx, 4 в итоге нужный нам word состоит из ah и cl, а я хочу чтобы было: Код (Text): shr eax, 18 rol eax, 4 ror al, 4 ...
значит делаешь что то не так сдвиг работает нормально и юзается в таком виде в многих криптоалгоритмах
Код (Text): w = ( dwIn >> 24 ); w = ( w << 4)|( w >> 28 ); : Код (Text): shr eax, 28 shl eax, 4 выход - ax %)
icent Если у тебя 8 бит, то юзай char + размерность само собой не 32 бита, а 8. Но це по оптимальности с ассемблером всё равно тягаться тяжело. Не даром в том же OpenSSL используются вставки.
iceint замени на Неплохо бы еще добавить возможность использовать этот формат: 00786F72h У меня есть свой пример, но мне его стыдно показывать .
изначально так и было, как в асмовском примере, но я почему-то подумал, что так лучше, ибо прыжок один остается, а операций сложения, в случае, если буквы, а не цифры.. а смысл тогда?