Поворот таблиц

Тема в разделе "WASM.BEGINNERS", создана пользователем asd, 30 сен 2005.

  1. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Помогите пожалуйсто кто может. задача такова:

    есть таблица 4*4 в ней стоят 2 точки, допустим так:

    1 0 0 0

    0 0 0 0

    0 1 0 0

    0 0 0 0

    (1-точка)

    1-ая строка старшие биты в ах ; 2-ая - 9-12 биты и т. д.

    нужно повернуть эту таблицу на 90 градусов

    0 0 0 0

    0 0 0 0

    0 0 1 0

    1 0 0 0

    так чтобы 1-ая строка старшие биты в ах ; 2-ая - 9-12 биты и т. д.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ну вариантов тут может быть несколько:

    Вариант 1. Ролим биты исходной таблицы по столбцам и заталкиваем последовательно в новую таблицу:
    Код (Text):
    1.     ;исходная таблица в ax
    2.     xor dx,dx
    3.     mov ecx,16
    4. .loop: 
    5.     rol ax,4   ;берем биты столбца ххх1 ххх2 ххх3 ххх4
    6.     rcl dx,1   ;заталкиваем в строку х1234 <-
    7.     dec ecx
    8.     jz .end
    9.     test ecx,3 ;крутим 4 раза, затем переходим к след.столбцу
    10.     jnz .loop      
    11.     shr ax,1   ;переход к др.столбцу хх1x хх2x хх3x хх4x -> ххх1 ххх2 ххх3 ххх4
    12.     jmp .loop  
    13. .end
    14.     mov ax,dx
    Вариант 2. Если единичек в таблице мало, то можно искать единички и менять их индекс с учетом разворота на 90:
    Код (Text):
    1.     ;исходная таблица в eax
    2.     xor edx,edx  
    3. .loop: 
    4.     bsf ecx,eax  ;находим единицу, в ecx - номер бита 0..15
    5.     mov ebx,1
    6.     jz .end      ;больше нет единиц
    7.     shl ebx,ecx
    8.     xor eax,ebx  ;зануляем единицу в исходной таблице
    9.     mov ebx,ecx  ;индекс = yyxx, хх - позиция в строке справа налево, yy - номер строки снизу вверх
    10.     or  ecx,3    ;yy11
    11.     xor ecx,ebx  ;00zz, где zz - инверсия позиции xx 0..3 -> 3..0
    12.     shr ebx,2    ;00yy
    13.     lea ebx,[ebx+ecx*4] ;zzyy - сделали разворот на 90
    14.     bts edx,ebx  ;пишем "точку" в новую таблицу
    15.         jmp .loop
    16. .end:
    17.     mov eax,edx
    Вариант 3. Можно использовать метод перестановки бит (группировки\раздвижки, инверсии) при умножении на специально выбранные магик-намберы. Но в данном сл. это скорее экзотика (лень возиться ;)
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Большое спасибо.