Поиск значений 13 бит в двух байтах...

Тема в разделе "WASM.BEGINNERS", создана пользователем rococo795, 21 дек 2016.

  1. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    0101 1000 0001 0000
    010 - не является частью поиска
    1 1000 0001 0000 - это число нужно искать

    каков алгоритм поиска?
    Брать два байта и сравнивать их со значениями которые вообще могут сложиться из неизменной второй части в 13 бит и изменяемой первой в 3 бита? то есть
    58 10 - удовлетворяет условию..
    18 10
    38 10
    78 10
    и так далее - все нечётные первые 4 бита.....

    и что каждые два байта сравнивать всегда с восемью значениями??? Нет более быстрого и умного решения???
     
    Последнее редактирование: 21 дек 2016
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Выполнить AND 0x1fff с неизвестным числом и сравнить результат с искомым.
     
  3. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    А если нам надо найти 1000 0001 или 1000 0001 0, или еще что нибудь? Блин возник вопрос, создам отдельной темой.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Никакой разницы. Мы просто применяем AND к обоим операндам с маской, в которой интересующие нас биты установлены в 1 и сравниваем их без задней мысли. Или можно сдвиг влево использовать на число не интересующих нас бит и затем сравнивать.
     
  5. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Спасибо... С каждым вопросом, а вернее Вашими ответами - тайн становится на чуть поменьше...:dance4:
     
  6. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Вынимаю видеоряд из .mts
    Загрузил в память исходный файл и открыл новый...
    Код (ASM):
    1.                    
    2.                     mov ebx,[HeapAllocMem]
    3.                     mov esi,[FileSizeIn]
    4.                     xor edi,edi      
    5.                     mov edi,5    ;файл состоит из пакетов по 192 байта, начинается сразу без заголовков
    6.                     sub esi,5     ;нужный пакет видео закодирован в 2 байтах каждого пакета по смещению 5
    7.  
    8.                 .cikl:
    9.  
    10.                     mov ax,[ebx+edi]
    11.                     mov [all],al
    12.                     mov [ahh],ah
    13.                     mov al,[ahh]
    14.                     mov ah,[all]
    15.                     and ax,$1200
    16.                     xor ax,$1200
    17.                     jnz .vpered
    18.  
    19.                         xor ecx,ecx
    20.                         mov ecx,ebx
    21.                         add ecx,edi
    22.                         sub ecx,5
    23.  
    24.                             invoke WriteFile,[FileOut],ecx,$0c0,cbWrite,0
    25.                             test eax,eax
    26.                             je .errWriteFile
    27.                        
    28.                         add edi,$0c0
    29.                         sub esi,$0c0
    30.                         cmp esi,$0c0
    31.                         jae .cikl
    32.                         jmp .close
    33.  
    34.                 .vpered:
    35.  
    36.                     add edi,$0c0
    37.                     sub esi,$0c0
    38.                     cmp esi,$0c0
    39.                     jae .cikl
    40.  
    41.                 .close:
    42.  
    Как можно окультурить?
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Код (ASM):
    1.  
    2.     mov ebx,[HeapAllocMem]
    3.     mov esi,[FileSizeIn]
    4.     mov edi, 5
    5.     sub esi, 5
    6.  
    7. .next_packet:
    8.     mov ax,[ebx+edi]
    9.     rol ax, 8
    10.     and ax,$1200
    11.     xor ax,$1200
    12.     jnz .skip_packet
    13.  
    14.     lea ecx, [ebx+edi-5]
    15.     invoke WriteFile,[FileOut],ecx,$0c0,cbWrite,0
    16.     test eax,eax
    17.     jz .errWriteFile
    18.  
    19. .skip_packet:
    20.     add edi,$0c0
    21.     sub esi,$0c0
    22.     cmp esi,$0c0
    23.     jae .next_packet
    24.  
     
  8. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    rmn,

    Спасибо.... Тут вот ещё какая хрень..... Если в 2 ух байтах мне надо смотреть маску 0000 0000 0000 0001 ... то почти любые значения будут якобы удовлетворять поиску а на самом деле хрень! пусть имеем в регистре 0001 1111 0011 0011 ... после and получаем вроде бы то что надо 0000 0000 0000 0001 .... и xor скажет что у вас удовлетворяет поиску... а на самом то деле нет...
    Или что не так думаю?
     
  9. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Не точно сказал. Проверяются 13 бит в каждой паре байт. Первые три бита не проверяем. Тогда нужно найти по маске ***0 0000 0000 0001 .. Если в регистре к примеру такие значения байт - 0001 1111 0011 0011 , то по маске 0000 0000 0000 0001 and создаст в регистре значение равное маске. Что искажает требуемый результат. Как можно сделать чтобы любое значение 13 бит можно было бы находить в 2 байтах, в которых первые 3 бита могут быть любыми?
     
  10. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Код (ASM):
    1.  
    2.                     mov ebx,[HeapAllocMem]
    3.                     mov esi,[FileSizeIn]
    4.                     xor edi,edi      
    5.                     mov edi,5
    6.                     sub esi,5
    7.  
    8.                 .cikl:
    9.  
    10.                     mov ax,[ebx+edi]
    11.                     rol ax,8
    12.                     btr ax,15
    13.                     btr ax,14
    14.                     btr ax,13
    15.                     xor ax,$1011
    16.                     jnz .vpered
    17.  
    18.                         lea ecx,[ebx+edi-5]
    19.                         invoke WriteFile,[FileOut],ecx,$0c0,cbWrite,0
    20.                         test eax,eax
    21.                         jz .errWriteFile
    22.  
    23.                 .vpered:
    24.  
    25.                     add edi,$0c0
    26.                     sub esi,$0c0
    27.                     cmp esi,$0c0
    28.                     jae .cikl
    29.  
    30.                 .close:
    31.  
    так по ходу надёжнее....
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Было же уже в начале темы:
    Код (ASM):
    1.  
    2. and  ax, $1fff
    3. cmp  ax, $0001
    4. jne  .skip_packet
    5.  
     
  12. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Понял...