Задачка о сортироке регистра (оптимизация по размеру)

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 13 июн 2008.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Нужно переставить байты регистра EAX таким образом, чтобы его значение стало минимальным. Каждый байт рассматривается как беззнаковое число от 0 до 255. Задач здесь несколько:

    1) Минимизировать код по размеру (сортируем 4 байта, можно использовать переходы).

    2) Минимизировать код по размеру не используя переходов (сортируем 4 байта).

    3) Минимизировать код по размеру не используя переходов если в регистре только 3 байта, а самый старший байт всегда равен 0.
     
  2. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    1) наобум... работает долго
    Код (Text):
    1.     mov eax,?
    2.     mov ecx,0x137
    3. l1: shr ecx,1
    4.     jnc l2
    5.     cmp ah,al
    6.     jc  l2
    7.     xchg    ah,al
    8. l2: jecxz   l3
    9.     ror eax,8
    10.     jmp l1
    11. l3: ret
     
  3. Nero_n

    Nero_n New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2008
    Сообщения:
    33
    1) пузырьковая
    Код (Text):
    1. mov eax,????
    2. mov cl,D0h
    3. looop:
    4. cmp ah,al
    5. jb @F
    6. xchg ah,al
    7. @@:
    8. ror eax,cl
    9. add cl,8
    10. jnz looop
    11. ror eax,8
    12. ret
    не могу подсчитать размер: возможно больше, чем у Proteus.

    [add]поправил код[/add]
     
  4. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
  5. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    3)... не претендую пока на оптимальность нигде.. (без переходов, но это этого не быстрее)

    Код (Text):
    1. l3: call    l2
    2.     ror eax,8
    3.     call    l2
    4.     rol eax,8
    5. l2: mov bh,al
    6.     mov      bl,ah
    7.     cmp ax,bx
    8.     cmovnc ax,bx
    9.     ret
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Proteus
    не, call считается переходом :)
     
  7. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    На самом деле это вроде идеальный вариант. У меня тоже пузырьковая. Но она довольно некрасиво сделана. Много холостых проходов делает. И вообще пузрьковая годится. Тут помойму меньше 5-6 сравнений всё равно никак. Ну разве что сделать какие-то хитрые махинации с перестановками, за счёт того что некоторые байты будут временно в обратную сторону сортироваться.
     
  8. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Для 64 байтного регистра эта задача тоже была бы интересна. Там можно хотя бы количество сравнений минимизировать, это дополнительный простор =)
     
  9. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Код (Text):
    1.    
    2.     mov eax, N      ;1
    3.     movzx ecx, al       ;2
    4.     movzx edx, ah       ;3
    5.     shr eax, 16
    6.     movzx ebx, al               ;4
    7.     shr eax, 8
    8.  
    9.     mov esi, eax
    10.     cmp eax, ecx        ;1 c 2
    11.     cmova eax, ecx
    12.     cmova ecx, esi
    13.    
    14.     mov esi, edx
    15.     cmp edx, ebx        ;3 c 4
    16.     cmova edx, ebx
    17.     cmova ebx, esi
    18.    
    19.     mov esi, eax
    20.     cmp eax, edx        ;1 c 3
    21.     cmova eax, edx
    22.     cmova edx, esi
    23.  
    24.     mov esi, ecx
    25.     cmp ecx, ebx        ;2 c 4
    26.     cmova ecx, ebx
    27.     cmova ebx, esi
    28.    
    29.     mov esi, ecx
    30.     cmp ecx, edx        ;2 c 3
    31.     cmova ecx, edx
    32.     cmova edx, esi 
    33.  
    34.     shl edx, 16
    35.     shl ebx, 24
    36.     or ah, cl
    37.     or eax, edx
    38.     or eax, ebx   ;В eax отсортированный результат
    80 байт, 5 Сравнений, ни одного перехода.
    Не люблю я оптимизировать по размеру
     
  10. ivan2k2

    ivan2k2 New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2006
    Сообщения:
    95
    3) без переходов
    Код (Text):
    1. mov ebx,eax
    2. xchg bh,bl
    3. cmp eax,ebx
    4. cmova eax,ebx
    5. ror eax,8
    6. mov ebx,eax
    7. xchg bh,bl
    8. cmp eax,ebx
    9. cmova eax,ebx
    10. rol eax,8
    11. mov ebx,eax
    12. xchg bh,bl
    13. cmp eax,ebx
    14. cmova eax,ebx
    33 байта
     
  11. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    ivan2k2
    Код неверен
    1) Изначально eax = 0DDBBCCAAh
    В конце eax = 0DDAABBCCh
    2) Изначально eax = 0DDCCBBAAh
    В конце eax = 0DDAABBCCh

    Несортирует

    Ты его вообще проверял?
     
  12. ivan2k2

    ivan2k2 New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2006
    Сообщения:
    95
    Miller Rabin это для 3-его случая, когда старший байт всегда 0
     
  13. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Точно. Для третьего варианта все работает правильно
     
  14. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    2) 73 байта, но явно что-то лишнее есть
    Код (Text):
    1.     cmp al,ah
    2.     sbb bl,bl
    3.     xor al,ah
    4.     and bl,al
    5.     xor ah,bl
    6.     xor al,ah
    7.  
    8.     bswap eax
    9.  
    10.     cmp al,ah
    11.     sbb bl,bl
    12.     xor al,ah
    13.     and bl,al
    14.     xor ah,bl
    15.     xor al,ah
    16.  
    17.     ror eax,8  
    18.    
    19.     cmp ah,al
    20.     sbb bl,bl
    21.     xor al,ah
    22.     and bl,al
    23.     xor ah,bl
    24.     xor al,ah
    25.  
    26.     bswap eax  
    27.  
    28.     cmp al,ah
    29.     sbb bl,bl
    30.     xor al,ah
    31.     and bl,al
    32.     xor ah,bl
    33.     xor al,ah
    34.  
    35.     ror eax,8
    36.  
    37.     cmp al,ah
    38.     sbb bl,bl
    39.     xor al,ah
    40.     and bl,al
    41.     xor ah,bl
    42.     xor al,ah
    43.  
    44.     rol eax,8
     
  15. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    немного изменил, 58 байт:
    Код (Text):
    1.     mov ebx,eax
    2.     xchg bl,bh
    3.     cmp ah,al
    4.     cmova eax,ebx
    5.  
    6.     bswap eax
    7.  
    8.     mov ebx,eax
    9.     xchg bl,bh
    10.     cmp ah,al
    11.     cmova eax,ebx
    12.  
    13.     ror eax,8  
    14.    
    15.     mov ebx,eax
    16.     xchg bl,bh
    17.     cmp ah,al
    18.     cmovb eax,ebx
    19.  
    20.     bswap eax  
    21.  
    22.     mov ebx,eax
    23.     xchg bl,bh
    24.     cmp ah,al
    25.     cmova eax,ebx
    26.  
    27.     ror eax,8
    28.  
    29.     mov ebx,eax
    30.     xchg bl,bh
    31.     cmp ah,al
    32.     cmova eax,ebx
    33.  
    34.     rol eax,8
     
  16. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    а если без ah, bh?
     
  17. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    t00x
    Вариант без bh, 55 байт:)
    Код (Text):
    1.     shld edx,eax,16
    2.     cmp dl,al
    3.     sbb cl,cl
    4.     cmp dh,ah
    5.     sbb ch,ch
    6.     xor eax,edx
    7.     and ecx,eax
    8.     xor edx,ecx
    9.     xor eax,edx
    10.  
    11.     xchg al,dh
    12.     cmp dl,al
    13.     sbb cl,cl
    14.     cmp dh,ah
    15.     sbb ch,ch
    16.     xor eax,edx
    17.     and ecx,eax
    18.     xor edx,ecx
    19.     xor eax,edx
    20.  
    21.     cmp dh,al
    22.     sbb cl,cl
    23.     xor al,dh
    24.     and cl,al
    25.     xor dh,cl
    26.     xor al,dh
    27.     shl eax,16
    28.     xchg ax,dx
     
  18. ivan2k2

    ivan2k2 New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2006
    Сообщения:
    95
  19. ivan2k2

    ivan2k2 New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2006
    Сообщения:
    95
  20. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Что-то ни чего в голову не приходит. Вот 38 байт
    Код (Text):
    1. push  dword ????
    2. mov   esi,esp
    3. mov   ecx,3
    4. @sort1:
    5. lodsb
    6. mov   edi,esi
    7. push  cx
    8. @sort2: scasb
    9.         ja  @skip
    10.         xchg al,[edi-1]
    11.         mov  [esi-1],al
    12.         @skip:
    13. loop @sort2
    14. pop   cx
    15. loop @sort1
    16. pop   eax
    Наверно очень медленно и тупо.