Нужно переставить байты регистра EAX таким образом, чтобы его значение стало минимальным. Каждый байт рассматривается как беззнаковое число от 0 до 255. Задач здесь несколько: 1) Минимизировать код по размеру (сортируем 4 байта, можно использовать переходы). 2) Минимизировать код по размеру не используя переходов (сортируем 4 байта). 3) Минимизировать код по размеру не используя переходов если в регистре только 3 байта, а самый старший байт всегда равен 0.
1) наобум... работает долго Код (Text): mov eax,? mov ecx,0x137 l1: shr ecx,1 jnc l2 cmp ah,al jc l2 xchg ah,al l2: jecxz l3 ror eax,8 jmp l1 l3: ret
1) пузырьковая Код (Text): mov eax,???? mov cl,D0h looop: cmp ah,al jb @F xchg ah,al @@: ror eax,cl add cl,8 jnz looop ror eax,8 ret не могу подсчитать размер: возможно больше, чем у Proteus. [add]поправил код[/add]
3)... не претендую пока на оптимальность нигде.. (без переходов, но это этого не быстрее) Код (Text): l3: call l2 ror eax,8 call l2 rol eax,8 l2: mov bh,al mov bl,ah cmp ax,bx cmovnc ax,bx ret
На самом деле это вроде идеальный вариант. У меня тоже пузырьковая. Но она довольно некрасиво сделана. Много холостых проходов делает. И вообще пузрьковая годится. Тут помойму меньше 5-6 сравнений всё равно никак. Ну разве что сделать какие-то хитрые махинации с перестановками, за счёт того что некоторые байты будут временно в обратную сторону сортироваться.
Для 64 байтного регистра эта задача тоже была бы интересна. Там можно хотя бы количество сравнений минимизировать, это дополнительный простор =)
Код (Text): mov eax, N ;1 movzx ecx, al ;2 movzx edx, ah ;3 shr eax, 16 movzx ebx, al ;4 shr eax, 8 mov esi, eax cmp eax, ecx ;1 c 2 cmova eax, ecx cmova ecx, esi mov esi, edx cmp edx, ebx ;3 c 4 cmova edx, ebx cmova ebx, esi mov esi, eax cmp eax, edx ;1 c 3 cmova eax, edx cmova edx, esi mov esi, ecx cmp ecx, ebx ;2 c 4 cmova ecx, ebx cmova ebx, esi mov esi, ecx cmp ecx, edx ;2 c 3 cmova ecx, edx cmova edx, esi shl edx, 16 shl ebx, 24 or ah, cl or eax, edx or eax, ebx ;В eax отсортированный результат 80 байт, 5 Сравнений, ни одного перехода. Не люблю я оптимизировать по размеру
3) без переходов Код (Text): mov ebx,eax xchg bh,bl cmp eax,ebx cmova eax,ebx ror eax,8 mov ebx,eax xchg bh,bl cmp eax,ebx cmova eax,ebx rol eax,8 mov ebx,eax xchg bh,bl cmp eax,ebx cmova eax,ebx 33 байта
ivan2k2 Код неверен 1) Изначально eax = 0DDBBCCAAh В конце eax = 0DDAABBCCh 2) Изначально eax = 0DDCCBBAAh В конце eax = 0DDAABBCCh Несортирует Ты его вообще проверял?
2) 73 байта, но явно что-то лишнее есть Код (Text): cmp al,ah sbb bl,bl xor al,ah and bl,al xor ah,bl xor al,ah bswap eax cmp al,ah sbb bl,bl xor al,ah and bl,al xor ah,bl xor al,ah ror eax,8 cmp ah,al sbb bl,bl xor al,ah and bl,al xor ah,bl xor al,ah bswap eax cmp al,ah sbb bl,bl xor al,ah and bl,al xor ah,bl xor al,ah ror eax,8 cmp al,ah sbb bl,bl xor al,ah and bl,al xor ah,bl xor al,ah rol eax,8
немного изменил, 58 байт: Код (Text): mov ebx,eax xchg bl,bh cmp ah,al cmova eax,ebx bswap eax mov ebx,eax xchg bl,bh cmp ah,al cmova eax,ebx ror eax,8 mov ebx,eax xchg bl,bh cmp ah,al cmovb eax,ebx bswap eax mov ebx,eax xchg bl,bh cmp ah,al cmova eax,ebx ror eax,8 mov ebx,eax xchg bl,bh cmp ah,al cmova eax,ebx rol eax,8
t00x Вариант без bh, 55 байт Код (Text): shld edx,eax,16 cmp dl,al sbb cl,cl cmp dh,ah sbb ch,ch xor eax,edx and ecx,eax xor edx,ecx xor eax,edx xchg al,dh cmp dl,al sbb cl,cl cmp dh,ah sbb ch,ch xor eax,edx and ecx,eax xor edx,ecx xor eax,edx cmp dh,al sbb cl,cl xor al,dh and cl,al xor dh,cl xor al,dh shl eax,16 xchg ax,dx
Что-то ни чего в голову не приходит. Вот 38 байт Код (Text): push dword ???? mov esi,esp mov ecx,3 @sort1: lodsb mov edi,esi push cx @sort2: scasb ja @skip xchg al,[edi-1] mov [esi-1],al @skip: loop @sort2 pop cx loop @sort1 pop eax Наверно очень медленно и тупо.