Распаковка данных в формате ULZ на Ассемблере
Распаковка данных в формате ULZ на Ассемблере
Алгоритм упаковки ULZ (Ultra-fast LZ) был разработан Ильей Муравьевым в 2010 году, а в 2019 году выложен в открытый доступ. Илью вы должны помнить по модификации упаковщика LZ4. Алгоритм ULZ стал очередным развитием классического LZ77, но с максимальным упором на скорость упаковки и распаковки данных.
Несмотря на родство алгоритма с LZ77, формат упакованных данных отличается. Первые 4 байта - сигнатура "ULZ!", затем идет DWORD с размером упакованных данных без учета заголовка, а после этого идут сами упакованные данные. Степень сжатия получается хоть и получше, чем у классического LZ77, но все равно заметно отстает от лидеров. Но если учесть, что тут все сделано для достижения максимальной скорости обработки данных, недостаточную степень сжатия можно простить.
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------
- ; Распаковка данных в формате ULZ
- ;------------------------------------------------------------
- ; На входе:
- ; lpCompressed - указатель на упакованные данные
- ; lpOut - указатель на буфер для распакованных данных
- ; На выходе:
- ; EAX = размер распакованных данных
- ;------------------------------------------------------------
- proc ulz_unpack lpCompressed:DWORD,lpOut:DWORD
- pushad
- mov esi,[lpCompressed]
- mov edi,[lpOut]
- lodsd
- lodsd
- xchg ebx,eax
- add ebx,esi
- .ulz_main:
- xor ecx,ecx
- mul ecx
- cmp esi,ebx
- jnb .ulz_exit
- lodsb
- cmp al,32
- jb .ulz_copy2
- mov cl,al
- shr cl,5
- cmp cl,7
- jne .ulz_copy1
- stdcall .add_mod
- .ulz_copy1:
- rep movsb
- cmp esi, ebx
- jae .ulz_exit
- .ulz_copy2:
- mov cl,al
- and cl,15
- add cl,4
- cmp cl,15+4
- jne .ulz_copy3
- stdcall .add_mod
- .ulz_copy3:
- and al,16
- shl eax,12
- xchg eax,edx
- lodsw
- add edx,eax
- push esi
- mov esi,edi
- sub esi,edx
- rep movsb
- pop esi
- jmp .ulz_main
- .ulz_exit:
- sub edi,[lpOut]
- mov [esp+28],edi
- popa
- ret
- .add_mod:
- push eax
- xchg eax,ecx
- xor ecx,ecx
- .am_loop:
- mov dl,byte[esi]
- inc esi
- push edx
- shl edx,cl
- add eax,edx
- pop edx
- cmp dl,128
- jb .am_exit
- add cl,7
- cmp cl,21
- jbe .am_loop
- .am_exit:
- xchg eax,ecx
- pop eax
- retn
- endp
В приложении пример программы с исходным текстом, которая извлекает из памяти иконку, упакованную по алгоритму ULZ, и выводит ее на форму. Там же в архиве утилита для упаковки и распаковки данных от Ильи Муравьева.
Просмотров: 996 | Комментариев: 4
Метки: Assembler, распаковка
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
darkz
(24.01.2021 в 22:41):
ManHunter thanks you)
LZMA исходники можно выдрать из SimplePack 1.2 (3)
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?
Добавить комментарий
Заполните форму для добавления комментария
Если Вы есть на exetools (в отличие, увы, от меня) - см.
https://forum.exetools.com/sho...php?p=115175
Это, правда, не FASM, но уже ассемблер.