Ниже представлен код для ассемблера fasm, который распаковывает данные, сжатые через утилиту compress. Она в деталях немного отличается от того, что сжимает GIF. Размер словаря может быть до 256 Кб. Необходимо указать следующие параметры:
EBX – стартовый адрес байтовой последовательности (без заголовка LZW)
ECX – размер входного файла
EBP – адрес начала словаря, временная память
EDI – область памяти, куда распаковать
При указании ebx нужно обязательно пропустить 3 первых байта заголовка, где написано LZW.
§ Код на ассемблере
LZW_decompress:
mov [.size], ecx; Окончание потока
add [.size], ebx
call .init
.rept:cmpebx, [.size]
jnb .end; Декомпрессия закончилась?
movcl, [.bitn]
moveax, [ebx]
shreax, cl; Сдвинуть на CL бит
andeax, [.mask] ; Срезать bitn бит
addcl, [.bitk] ; Передвинуть поток
mov [.bitn], cl
and [.bitn], byte7; Запись в .bitn младших 3 бит
movzxecx, cl
shrecx, 3
addebx, ecx; Передвинуть EBX на (CL>>3)
cmpeax, 100h
jb .single ; ax < 100h -- простой байт
je .cmd ; ax = 100h -- команда очистки словаря
subeax, 101h ; Указатель на построенный словарь
cmpedx, eax
jbe .error ; eax - указатель на словарь если edx <= eax, словарь превышен
; СЛОВАРЬ (8 байт на 1 эл-т)
; 4 | +0 | Количество символов
; 4 | +4 | Указатель на строку для повторения
movecx, [ebp + 8*eax + 0] ; Длина последовательности
movesi, [ebp + 8*eax + 4] ; Начало
; Скопировать кол-во символов из предыдущего элемента и +1 к длине
; Записать в следующий элемент текущий указатель EDI (построение словаря)