Blog. Just Blog

Распаковка данных в формате ULZ на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Распаковка данных в формате ULZ на Ассемблере
Распаковка данных в формате ULZ на Ассемблере

Алгоритм упаковки ULZ (Ultra-fast LZ) был разработан Ильей Муравьевым в 2010 году, а в 2019 году выложен в открытый доступ. Илью вы должны помнить по модификации упаковщика LZ4. Алгоритм ULZ стал очередным развитием классического LZ77, но с максимальным упором на скорость упаковки и распаковки данных.

Несмотря на родство алгоритма с LZ77, формат упакованных данных отличается. Первые 4 байта - сигнатура "ULZ!", затем идет DWORD с размером упакованных данных без учета заголовка, а после этого идут сами упакованные данные. Степень сжатия получается хоть и получше, чем у классического LZ77, но все равно заметно отстает от лидеров. Но если учесть, что тут все сделано для достижения максимальной скорости обработки данных, недостаточную степень сжатия можно простить.
  1. ;------------------------------------------------------------
  2. ; Распаковка данных в формате ULZ
  3. ;------------------------------------------------------------
  4. ; На входе:
  5. ;   lpCompressed - указатель на упакованные данные
  6. ;   lpOut - указатель на буфер для распакованных данных
  7. ; На выходе:
  8. ;   EAX = размер распакованных данных
  9. ;------------------------------------------------------------
  10. proc ulz_unpack lpCompressed:DWORD,lpOut:DWORD
  11.         pushad
  12.         mov     esi,[lpCompressed]
  13.         mov     edi,[lpOut]
  14.         lodsd
  15.         lodsd
  16.         xchg    ebx,eax
  17.         add     ebx,esi
  18. .ulz_main:
  19.         xor     ecx,ecx
  20.         mul     ecx
  21.         cmp     esi,ebx
  22.         jnb     .ulz_exit
  23.         lodsb
  24.         cmp     al,32
  25.         jb      .ulz_copy2
  26.         mov     cl,al
  27.         shr     cl,5
  28.         cmp     cl,7
  29.         jne     .ulz_copy1
  30.         stdcall .add_mod
  31. .ulz_copy1:
  32.         rep     movsb
  33.         cmp     esi, ebx
  34.         jae     .ulz_exit
  35. .ulz_copy2:
  36.         mov     cl,al
  37.         and     cl,15
  38.         add     cl,4
  39.         cmp     cl,15+4
  40.         jne     .ulz_copy3
  41.         stdcall .add_mod
  42. .ulz_copy3:
  43.         and     al,16
  44.         shl     eax,12
  45.         xchg    eax,edx
  46.         lodsw
  47.         add     edx,eax
  48.         push    esi
  49.         mov     esi,edi
  50.         sub     esi,edx
  51.         rep     movsb
  52.         pop     esi
  53.         jmp     .ulz_main
  54. .ulz_exit:
  55.         sub     edi,[lpOut]
  56.         mov     [esp+28],edi
  57.         popa
  58.         ret
  59. .add_mod:
  60.         push    eax
  61.         xchg    eax,ecx
  62.         xor     ecx,ecx
  63. .am_loop:
  64.         mov     dl,byte[esi]
  65.         inc     esi
  66.         push    edx
  67.         shl     edx,cl
  68.         add     eax,edx
  69.         pop     edx
  70.         cmp     dl,128
  71.         jb      .am_exit
  72.         add     cl,7
  73.         cmp     cl,21
  74.         jbe     .am_loop
  75. .am_exit:
  76.         xchg    eax,ecx
  77.         pop     eax
  78.         retn
  79. endp
В качестве параметров передается указатель на упакованные данные и указатель на буфер-приемник. На выходе в регистре EAX возвращается количество байт, которое было извлечено из сжатых данных. Размер принимающего буфера в процессе распаковки никак не проверяется, об этом вы должны позаботиться самостоятельно.

В приложении пример программы с исходным текстом, которая извлекает из памяти иконку, упакованную по алгоритму ULZ, и выводит ее на форму. Там же в архиве утилита для упаковки и распаковки данных от Ильи Муравьева.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

ULZ.Unpack.Demo.zip (57,325 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 996 | Комментариев: 4

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Petya (07.04.2021 в 17:15):
ЦитатаА есть вариант распаковки LZMA|LZMA2 на FASM?

Если Вы есть на exetools (в отличие, увы, от меня) - см.
https://forum.exetools.com/sho...php?p=115175
Это, правда, не FASM, но уже ассемблер.
darkz (24.01.2021 в 22:41):
ManHunter thanks you)

LZMA исходники можно выдрать из SimplePack 1.2 (3)
ManHunter (22.01.2021 в 13:47):
LZMA нет. Вот тут https://github.com/ionescu007/minlzma есть сишный вариант.
Win (22.01.2021 в 13:42):
А есть вариант распаковки LZMA|LZMA2 на FASM?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0115 сек.) / Память: 4.5 Mb
Наверх