Главная »
Асм » Код распаковщика для утилиты compress в linux
§ Описание
Ниже представлен код для ассемблера fasm, который распаковывает данные, сжатые через утилиту compress. Она в деталях немного отличается от того, что сжимает GIF. Размер словаря может быть до 256 Кб. Необходимо указать следующие параметры:
-
EBX
— стартовый адрес байтовой последовательности (без заголовка LZW) -
ECX
— размер входного файла -
EBP
— адрес начала словаря, временная память -
EDI
— область памяти, куда распаковать
При указании
ebx
нужно обязательно пропустить 3 первых байта заголовка, где написано LZW.
§ Код на ассемблере
LZW_decompress:
mov [.size], ecx
add [.size], ebx
call .init
.rept: cmp ebx, [.size]
jnb .end
mov cl, [.bitn]
mov eax, [ebx]
shr eax, cl
and eax, [.mask]
add cl, [.bitk]
mov [.bitn], cl
and [.bitn], byte 7
movzx ecx, cl
shr ecx, 3
add ebx, ecx
cmp eax, 100h
jb .single
je .cmd
sub eax, 101h
cmp edx, eax
jbe .error
mov ecx, [ebp + 8*eax + 0]
mov esi, [ebp + 8*eax + 4]
lea eax, [ecx + 1]
mov [ebp + 8*edx + 0], eax
mov [ebp + 8*edx + 4], edi
rep movsb
jmp .next
.single:
mov [ebp + 8*edx + 0], dword 2
mov [ebp + 8*edx + 4], edi
stosb
.next:
inc edx
cmp edx, [.topnext]
jb .rept
mov eax, [.topnext]
add eax, 100h
add eax, eax
sub eax, 100h
mov [.topnext], eax
inc byte [.bitk]
mov cl, [.bitk]
mov eax, 1
shl eax, cl
dec eax
mov [.mask], eax
jmp .rept
.cmd: call .init
and ebx, 0xFFFFFF0
add ebx, 10h
jmp .rept
.init: mov [.bitn], byte 0
mov [.bitk], byte 9
mov [.mask], dword 1FFh
mov [.topnext], dword 100h
xor edx, edx
ret
.error: stc
ret
.end: clc
ret
.bitn: db 0
.bitk: db 9
.size: dd 0
.topnext: dd 100h
.mask: dd 1FFh