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

Распаковка данных в формате LZSS на Ассемблере
Алгоритм компрессии LZSS - очередная модификация алгоритма LZ77 за авторством James Storer и Thomas Szymanski. По первым буквам их фамилий алгоритм и получил свое название. Впервые авторы опубликовали свою работу в 1982 году, с тех пор на базе LZSS появилось несколько компрессоров от разных авторов. Скорость упаковки не самая высокая, коэффициент сжатия тоже оставляет желать лучшего, зато хорошая скорость распаковки.
Как я уже упомянул выше, в природе есть несколько инструментов, использующих этот алгоритм сжатия. Я собрал утилиту для сжатия на основе исходников от Sebastian Steinhauer, она есть в прилагаемом архиве.
Упакованные данные в формате LZSS не предусматривают никакой информации о размере исходных данных, а также при распаковке алгоритм самостоятельно никак не определяет окончание потока упакованных данных. Так что для функции распаковки приходится передавать как минимум еще один параметр - размер упакованных данных.
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------
- ; Распаковка данных в формате LZSS
- ;------------------------------------------------------------
- ; На входе:
- ; lpCompressed - указатель на упакованные данные
- ; lpOut - указатель на буфер для распакованных данных
- ; dSize - размер упакованных данных
- ; На выходе:
- ; EAX = размер распакованных данных
- ;------------------------------------------------------------
- proc lzss_unpack lpCompressed:DWORD, lpOut:DWORD, dSize:DWORD
- pusha
- mov esi,[lpCompressed]
- mov edi,[lpOut]
- mov eax,[dSize]
- lea ebx,[esi+eax]
- lzss_loop:
- mov ah,9
- lodsb
- lzss_main:
- cmp esi,ebx
- jae lzss_exit
- dec ah
- jz lzss_loop
- rcr al,1
- jnc read_block
- movsb
- lzss_next:
- and al,7Fh
- jmp lzss_main
- read_block:
- movzx edx,word[esi]
- xchg dl,dh
- add esi,2
- mov ecx,edx
- and ecx,15
- add ecx,3
- shr edx,4
- push esi
- lea esi,[edi-1]
- sub esi,edx
- rep movsb
- pop esi
- jmp lzss_next
- lzss_exit:
- sub edi,[lpOut]
- mov [esp+28],edi
- popa
- ret
- endp
В приложении пример программы с исходным текстом, которая извлекает из памяти иконку, упакованную по алгоритму LZSS, и выводит ее на форму.
Просмотров: 504 | Комментариев: 6
Метки: Assembler, распаковка

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Petya
(12.02.2024 в 16:39):
Звиняйте. Слишком тонкий он у вас тут.

ManHunter
(12.02.2024 в 16:30):
Petya, тут человек в юмор пытается, а ты умные слова говоришь.

Petya
(12.02.2024 в 16:25):
Если серьёзно, то всё просто - LZ остались от оригинального алгоритма и означают Lempel&Ziv. А SS уже от упомянутых людей.

As is
(11.02.2024 в 19:42):
Ну а 4то? - прикольно! Интересно, какой подход был-бы к образованию названия, если бы у одного из авторов фамилия начиналась, скажем, с буквы A?

ManHunter
(11.02.2024 в 19:12):
Во, шутки за 300 подвезли.

As is
(11.02.2024 в 19:10):
"LZ77 за авторством James Storer и Thomas Szymanski. По первым буквам их фамилий алгоритм и получил свое название." - буква Z, у одного из авторов, явно не первая в фамилии, и ни у одного, ни в фамилии, ни в имени нет буквы L :)

Добавить комментарий
Заполните форму для добавления комментария
