Задачка о повороте матрицы 5x5 (оптимизация по размеру)

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

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Есть битовая матрица
    Код (Text):
    1. ABCDE
    2. FGHIJ
    3. KLMNO
    4. PQRST
    5. UVWXY
    которая хранится в регистре в виде 0000000ABCDEFGHIJKLMNOPQRSTUVWXY. Необходимо повернуть эту матрицу вокруг диагонали AY, то есть получить матрицу
    Код (Text):
    1. AFKPU
    2. BGLQV
    3. CHMRW
    4. DINSX
    5. EJOTY
    которая в регистре хранится как 0000000AFKPUBGLQVCHMRWDINSXEJOTY.

    1) оптимизировать по размеру.
    2) оптимизировать по размеру не используя команд переходов. Подсказка: нужно поискать по форуму константу 8040201, хотя может со сдвигами и короче будет.
    Регистр, в котором будет матрица, выбираете по своему вкусу, результат записываете в него же.
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Black_mirror не знаю насколько красиво и коротко, но мне пришло в голову такое решение:
    Код (Text):
    1. .code
    2. start:  invoke MessageBox, 0,addr text1,addr text3,0
    3.     mov ebx,6
    4.     mov ecx,25
    5.     xor esi,esi
    6. a1: mov eax,esi
    7.     xor edx,edx
    8.     div ebx
    9.     test edx,edx
    10.     setz al
    11.     sub max,al
    12.     lea edi,text2[esi+edx*4]
    13.     cmp dl,max
    14.     setb dl
    15.     dec edx
    16.     and edx,24
    17.     sub edi,edx
    18.     mov al,text1[esi]
    19.     stosb
    20.     inc esi
    21.     loop a1
    22.         invoke MessageBox,0,addr text2,addr text3,0
    23. retn
    24. .data
    25. max db 6
    26. text1   db 'ABCDEFGHIJKLMNOPQRSTUVWXY',0
    27. text2   db 26 dup (0)
    28. text3   db 'matrix',0
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Mikl__
    Здесь не байты нужно переставлять, а биты внутри 32х разрядного регистра.
    Есть в регистре находится 0000000 11110 00000 11100 00000 01111,
    то после перестановки должно быть 0000000 10100 10101 10101 10001 00001
     
  4. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Black_mirror извини, я думал, требуется транспонировать матрицу вокруг оси AY
    ABCDE AFKPU
    FGHIJ BGLQV
    KLMNO в CHMRW
    PQRST DINSX
    UVWXY EJOTY
     
  5. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Учим матчасть, это называется транспонировать.

    В общем случае решается элементарно, типа Swap(A[i,j], A[j.i]).
    Специфика тут только в том, что элементы матрицы - биты.

    Я решал похожую задачу просто, по черному, написал две подпрограммы типа GetBit(i,j) и SetBit(i,j) и вызывал их вместо операторов присваивания.
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Black_mirror
    "Мелкие задачки для крупных мозгов 2" ?:)

    Сдвигами. Размер 0x5b
    Код (Text):
    1.         push eax
    2.     push eax
    3.     push eax
    4.     push eax
    5.     push eax
    6.     push eax
    7.     push eax
    8.     push eax
    9.    
    10.     mov esi,1000001000001000001000001b
    11.     and eax,esi
    12.  
    13.     shr esi,5
    14.     pop edx
    15.     and edx,esi
    16.     rol  edx,4
    17.     or   eax,edx
    18.     pop edx
    19.     ror  edx,4
    20.     and edx,esi
    21.     or   eax,edx
    22.  
    23.     shr esi,5
    24.     pop edx
    25.     and edx,esi
    26.     rol  edx,8
    27.     or   eax,edx
    28.     pop edx
    29.     ror  edx,8
    30.     and edx,esi
    31.     or   eax,edx
    32.  
    33.     shr esi,5
    34.     pop edx
    35.     and edx,esi
    36.     rol  edx,12
    37.     or   eax,edx
    38.     pop edx
    39.     ror  edx,12
    40.     and edx,esi
    41.     or   eax,edx
    42.  
    43.  
    44.  
    45.     shr esi,5
    46.     pop edx
    47.     and edx,esi
    48.     rol  edx,16
    49.     or   eax,edx
    50.     pop edx
    51.     ror  edx,16
    52.     and edx,esi
    53.     or   eax,edx
     
  7. Proteus

    Proteus Member

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

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Код (Text):
    1.  00000000  B9 01084210        mov ecx,1000010000100001000010000b
    2.  00000005  BA 00011111        mov edx,10001000100010001b
    3.  0000000A  33 DB          xor ebx,ebx
    4.  0000000C  B3 1F          mov bl,11111b
    5.  0000000E  C1 E3 14       shl ebx,5*4
    6.                 ;1
    7.  00000011  8B F0          mov esi,eax
    8.  00000013  23 C1          and eax,ecx
    9.  00000015  0F AF C2       imul eax,edx
    10.  00000018  23 C3          and eax,ebx
    11.  0000001A  8B F8          mov edi,eax
    12.  0000001C  D1 E9          shr ecx,1
    13.  0000001E  D1 E2          shl edx,1
    14.                 ;2
    15.  00000020  8B C6          mov eax,esi
    16.  00000022  23 C1          and eax,ecx
    17.  00000024  0F AF C2       imul eax,edx
    18.  00000027  23 C3          and eax,ebx
    19.  00000029  C1 E8 05       shr eax,5*1
    20.  0000002C  0B F8          or edi,eax
    21.  0000002E  D1 E9          shr ecx,1
    22.  00000030  D1 E2          shl edx,1
    23.                 ;3
    24.  00000032  8B C6          mov eax,esi
    25.  00000034  23 C1          and eax,ecx
    26.  00000036  0F AF C2       imul eax,edx
    27.  00000039  23 C3          and eax,ebx
    28.  0000003B  C1 E8 0A       shr eax,5*2
    29.  0000003E  0B F8          or edi,eax
    30.  00000040  D1 E9          shr ecx,1
    31.  00000042  D1 E2          shl edx,1
    32.                 ;4
    33.  00000044  8B C6          mov eax,esi
    34.  00000046  23 C1          and eax,ecx
    35.  00000048  0F AF C2       imul eax,edx
    36.  0000004B  23 C3          and eax,ebx
    37.  0000004D  C1 E8 0F       shr eax,5*3
    38.  00000050  0B C7          or eax,edi
    39.  00000052  D1 E9          shr ecx,1
    40.  00000054  D1 E2          shl edx,1
    41.                 ;5
    42.  00000056  23 F1          and esi,ecx
    43.  00000058  0F AF F2       imul esi,edx
    44.  0000005B  23 F3          and esi,ebx
    45.  0000005D  C1 EE 14       shr esi,5*4
    46.  00000060  0B C6          or eax,esi
    47.  
    48.  00000062
    Задачу выгодно решать в цикле, но в условии - никаких переходов.

    Адд: Иcправил ошибку.
     
  9. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    _basmp_
    Тут две задачки :)

    1) оптимизировать по размеру.
    2) оптимизировать по размеру не используя команд переходов.

    В задаче нужно обменять биты
    23-19, 17-13, 11-7, 5-1 (разность - 4)
    22-14, 16-8,10-2 (разность - 8)
    21-9,15-3 (разность - 12)
    20-4 (разность - 16)
    Вот код(неоптимизировался) который обменивает биты по принципу T=A^B A^=T B^=T:
    Код (Text):
    1. 00402000 6BD810         imul   ebx,eax,00000010
    2. 00402003 6BCB10         imul   ecx,ebx,00000010
    3. 00402006 6BD110         imul   edx,ecx,00000010
    4. 00402009 6BF210         imul   esi,edx,00000010
    5. 0040200C 31C3           xor    ebx,eax
    6. 0040200E 31C1           xor    ecx,eax
    7. 00402010 31C2           xor    edx,eax
    8. 00402012 31C6           xor    esi,eax
    9. 00402014 81E320088200   and    ebx,00820820
    10. 0040201A 81E100044100   and    ecx,00410400
    11. 00402020 81E200802000   and    edx,00208000
    12. 00402026 81E600001000   and    esi,00100000
    13. 0040202C 31D8           xor    eax,ebx
    14. 0040202E 31C8           xor    eax,ecx
    15. 00402030 31D0           xor    eax,edx
    16. 00402032 31F0           xor    eax,esi
    17. 00402034 C1EB04         shr    ebx,04
    18. 00402037 C1E908         shr    ecx,08
    19. 0040203A C1EA0C         shr    edx,0C
    20. 0040203D C1EE10         shr    esi,10
    21. 00402040 31D8           xor    eax,ebx
    22. 00402042 31C8           xor    eax,ecx
    23. 00402044 31D0           xor    eax,edx
    24. 00402046 31F0           xor    eax,esi
     
  10. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Для 4x4
    Вариант 1
    Код (Text):
    1.     mov ax,????????????????b
    2.     mov cx,16
    3.     mov bx,1
    4.     mov di,bx
    5.     xor dx,dx
    6. CYCLE:
    7.     shr ax,1
    8.     jnc CONT
    9.     or dx,bx
    10. CONT:    
    11.     shl bx,4
    12.     jnz CONT2
    13.     shl di,1
    14.     or bx,di
    15. CONT2:
    16.     loop cycle
    Вариант 2
    Код (Text):
    1.     mov ax,????????????????b
    2.     mov bx,1
    3.     mov cx,bx
    4.     xor dx,dx
    5. CYCLE:
    6.     shr ax,1
    7.     jnc CONT
    8.     or dx,bx
    9. CONT:    
    10.     jz END
    11.     shl bx,4
    12.     jnz CYCLE
    13.     shl cx,1
    14.     or bx,cx
    15.     jmp CYCLE
    16. END: