Главная »
Асм » Код распаковщика для утилиты compress в linux
§ Описание
Ниже представлен код для ассемблера fasm, который распаковывает данные, сжатые через утилиту compress. Она в деталях немного отличается от того, что сжимает GIF. Размер словаря может быть до 256 Кб. Необходимо указать следующие параметры:
-
EBX
— стартовый адрес байтовой последовательности (без заголовка LZW) -
ECX
— размер входного файла -
EBP
— адрес начала словаря, временная память -
EDI
— область памяти, куда распаковать
При указании
ebx
нужно обязательно пропустить 3 первых байта заголовка, где написано LZW.
§ Код на ассемблере
1LZW_decompress:
2
3 mov [.size], ecx
4 add [.size], ebx
5 call .init
6.rept: cmp ebx, [.size]
7 jnb .end
8 mov cl, [.bitn]
9 mov eax, [ebx]
10 shr eax, cl
11 and eax, [.mask]
12 add cl, [.bitk]
13 mov [.bitn], cl
14 and [.bitn], byte 7
15 movzx ecx, cl
16 shr ecx, 3
17 add ebx, ecx
18 cmp eax, 100h
19 jb .single
20 je .cmd
21 sub eax, 101h
22 cmp edx, eax
23 jbe .error
24
25
26
27
28 mov ecx, [ebp + 8*eax + 0]
29 mov esi, [ebp + 8*eax + 4]
30
31
32
33 lea eax, [ecx + 1]
34 mov [ebp + 8*edx + 0], eax
35 mov [ebp + 8*edx + 4], edi
36 rep movsb
37 jmp .next
38
39
40.single:
41
42 mov [ebp + 8*edx + 0], dword 2
43 mov [ebp + 8*edx + 4], edi
44 stosb
45
46.next:
47 inc edx
48 cmp edx, [.topnext]
49 jb .rept
50
51
52 mov eax, [.topnext]
53 add eax, 100h
54 add eax, eax
55 sub eax, 100h
56 mov [.topnext], eax
57 inc byte [.bitk]
58
59
60 mov cl, [.bitk]
61 mov eax, 1
62 shl eax, cl
63 dec eax
64 mov [.mask], eax
65 jmp .rept
66
67
68.cmd: call .init
69 and ebx, 0xFFFFFF0
70 add ebx, 10h
71 jmp .rept
72
73
74.init: mov [.bitn], byte 0
75 mov [.bitk], byte 9
76 mov [.mask], dword 1FFh
77 mov [.topnext], dword 100h
78 xor edx, edx
79 ret
80
81.error: stc
82 ret
83.end: clc
84 ret
85
86
87.bitn: db 0
88.bitk: db 9
89.size: dd 0
90.topnext: dd 100h
91.mask: dd 1FFh
92
93