Subversion Repositories Kolibri OS

Rev

Rev 1149 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1149 Rev 6673
1
archiver.obj ýêñïîðòèðóåò äâå ôóíêöèè äëÿ ðàñïàêîâêè deflate-äàííûõ.
1
archiver.obj ýêñïîðòèðóåò äâå ôóíêöèè äëÿ ðàñïàêîâêè deflate-äàííûõ.
-
 
2
	À òàêæå ôóíêöèè: deflateInit, deflateInit2, deflateReset, deflate,
-
 
3
	deflateEnd äëÿ óïàêîâêè deflate-äàííûõ, ñäåëàííûå íà îñíîâå ñâîáîäíî
-
 
4
	ðàñïðîñòðàíÿåìîé áèáëèîòåêè zlib.
2
 
5
 
3
Ïåðâàÿ: deflate_unpack
6
Ïåðâàÿ: deflate_unpack
4
Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack(const void* data, unsigned* pLength);
7
Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack(const void* data, unsigned* pLength);
5
Àðãóìåíòû:
8
Àðãóìåíòû:
6
	data - óêàçàòåëü íà óïàêîâàííûå äàííûå
9
	data - óêàçàòåëü íà óïàêîâàííûå äàííûå
7
	pLength - óêàçàòåëü íà ïåðåìåííóþ äëèíû:
10
	pLength - óêàçàòåëü íà ïåðåìåííóþ äëèíû:
8
		íà âõîäå *pLength äîëæíî ñîäåðæàòü äëèíó âõîäíûõ äàííûõ data,
11
		íà âõîäå *pLength äîëæíî ñîäåðæàòü äëèíó âõîäíûõ äàííûõ data,
9
		íà âûõîäå *pLength çàïîëíèòñÿ äëèíîé âûõîäíûõ äàííûõ
12
		íà âûõîäå *pLength çàïîëíèòñÿ äëèíîé âûõîäíûõ äàííûõ
10
Âîçâðàùàåìîå çíà÷åíèå:
13
Âîçâðàùàåìîå çíà÷åíèå:
11
	óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè
14
	óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè
12
	ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé
15
	ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé
13
		ôóíêöèåé 68.13
16
		ôóíêöèåé 68.13
14
Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà:
17
Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà:
15
; ïóñòü esi = óêàçàòåëü íà äàííûå, ecx = äëèíà óïàêîâàííûõ äàííûõ
18
; ïóñòü esi = óêàçàòåëü íà äàííûå, ecx = äëèíà óïàêîâàííûõ äàííûõ
16
	push	ecx	; ïåðåìåííàÿ *pLength áóäåò â ñòåêå
19
	push	ecx	; ïåðåìåííàÿ *pLength áóäåò â ñòåêå
17
	push	esp	; à âîò è óêàçàòåëü íà íå¸ pLength
20
	push	esp	; à âîò è óêàçàòåëü íà íå¸ pLength
18
	push	esi	; à ýòî äàííûå
21
	push	esi	; à ýòî äàííûå
19
	call	[deflate_unpack]
22
	call	[deflate_unpack]
20
	pop	ecx	; âûòîëêíåì èç ñòåêà ïåðåìåííóþ *pLength
23
	pop	ecx	; âûòîëêíåì èç ñòåêà ïåðåìåííóþ *pLength
21
			; äâà àðãóìåíòà âûòîëêíåò ñàìà deflate_unpack
24
			; äâà àðãóìåíòà âûòîëêíåò ñàìà deflate_unpack
22
; òåïåðü eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = èõ äëèíà
25
; òåïåðü eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = èõ äëèíà
23
 
26
 
24
Âòîðàÿ: deflate_unpack2
27
Âòîðàÿ: deflate_unpack2
25
Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack2(const void* get_next_chunk, void* parameter, unsigned* pUnpackedLength);
28
Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack2(const void* get_next_chunk, void* parameter, unsigned* pUnpackedLength);
26
	void* __stdcall get_next_chunk(void* parameter, unsigned* pLength);
29
	void* __stdcall get_next_chunk(void* parameter, unsigned* pLength);
27
Àðãóìåíòû:
30
Àðãóìåíòû:
28
	get_next_chunk - óêàçàòåëü íà ôóíêöèþ, âîçâðàùàþùóþ óêàçàòåëü è äëèíó
31
	get_next_chunk - óêàçàòåëü íà ôóíêöèþ, âîçâðàùàþùóþ óêàçàòåëü è äëèíó
29
		î÷åðåäíîãî áëîêà óïàêîâàííûõ äàííûõ; êîãäà äàííûå
32
		î÷åðåäíîãî áëîêà óïàêîâàííûõ äàííûõ; êîãäà äàííûå
30
		çàêàí÷èâàþòñÿ, äîëæíà âîçâðàùàòü NULL (ïðè êîððåêòíûõ
33
		çàêàí÷èâàþòñÿ, äîëæíà âîçâðàùàòü NULL (ïðè êîððåêòíûõ
31
		óïàêîâàííûõ äàííûõ òàêîé ñèòóàöèè íå ìîæåò áûòü â ïðèíöèïå,
34
		óïàêîâàííûõ äàííûõ òàêîé ñèòóàöèè íå ìîæåò áûòü â ïðèíöèïå,
32
		ïðè íåêîððåêòíûõ äàííûõ åñëè ôóíêöèÿ âåðíóëà NULL, òî
35
		ïðè íåêîððåêòíûõ äàííûõ åñëè ôóíêöèÿ âåðíóëà NULL, òî
33
		äàëüíåéøèõ âûçîâîâ íå áóäåò)
36
		äàëüíåéøèõ âûçîâîâ íå áóäåò)
34
	parameter - ñóùíîñòü, êîòîðàÿ íå èñïîëüçóåòñÿ ñàìèì ðàñïàêîâùèêîì
37
	parameter - ñóùíîñòü, êîòîðàÿ íå èñïîëüçóåòñÿ ñàìèì ðàñïàêîâùèêîì
35
		è áåç èçìåíåíèé ïåðåäà¸òñÿ â get_next_chunk
38
		è áåç èçìåíåíèé ïåðåäà¸òñÿ â get_next_chunk
36
		(åñëè callback-ôóíêöèè îíà òîæå íå íóæíà, ìîæíî ïåðåäàâàòü
39
		(åñëè callback-ôóíêöèè îíà òîæå íå íóæíà, ìîæíî ïåðåäàâàòü
37
		â ýòîì ïàðàìåòðå âñ¸, ÷òî óãîäíî)
40
		â ýòîì ïàðàìåòðå âñ¸, ÷òî óãîäíî)
38
	pUnpackedLength - óêàçàòåëü íà ïåðåìåííóþ, êóäà áóäåò çàïèñàíà
41
	pUnpackedLength - óêàçàòåëü íà ïåðåìåííóþ, êóäà áóäåò çàïèñàíà
39
		äëèíà ðàñïàêîâàííûõ äàííûõ
42
		äëèíà ðàñïàêîâàííûõ äàííûõ
40
Âîçâðàùàåìîå çíà÷åíèå:
43
Âîçâðàùàåìîå çíà÷åíèå:
41
	óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè
44
	óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè
42
	ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé
45
	ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé
43
		ôóíêöèåé 68.13
46
		ôóíêöèåé 68.13
44
Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà:
47
Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà:
45
	push	eax	; âûäåëÿåì â ñòåêå ïåðåìåííóþ äëÿ *pUnpackedLength
48
	push	eax	; âûäåëÿåì â ñòåêå ïåðåìåííóþ äëÿ *pUnpackedLength
46
			; ïîñêîëüêó çíà÷åíèå íåâàæíî, êîðî÷å è áûñòðåå âñåãî
49
			; ïîñêîëüêó çíà÷åíèå íåâàæíî, êîðî÷å è áûñòðåå âñåãî
47
			; ñäåëàòü ýòî îäíîáàéòîâûì push <ðåãèñòð>
50
			; ñäåëàòü ýòî îäíîáàéòîâûì push <ðåãèñòð>
48
	push	esp	; à âîò è ñàì óêàçàòåëü pUnpackedLength
51
	push	esp	; à âîò è ñàì óêàçàòåëü pUnpackedLength
49
	push	esi	; êàêîé-íèáóäü ïàðàìåòð
52
	push	esi	; êàêîé-íèáóäü ïàðàìåòð
50
	push	deflate_callback
53
	push	deflate_callback
51
	call	[deflate_unpack2]
54
	call	[deflate_unpack2]
52
	pop	ecx	; âûòàëêèâàåì UnpackedLength
55
	pop	ecx	; âûòàëêèâàåì UnpackedLength
53
; êàê è â ïåðâîì ñëó÷àå, eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = ðàçìåð
56
; êàê è â ïåðâîì ñëó÷àå, eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = ðàçìåð
54
 
57
 
55
...
58
...
56
 
59
 
57
; à ýòî ôóíêöèÿ ïîëó÷åíèÿ ñëåäóþùåãî êóñêà óïàêîâàííûõ äàííûõ
60
; à ýòî ôóíêöèÿ ïîëó÷åíèÿ ñëåäóþùåãî êóñêà óïàêîâàííûõ äàííûõ
58
deflate_callback:
61
deflate_callback:
59
; åñëè íóæåí ïàðàìåòð, òî äîñòàòü åãî ìîæíî òàê:
62
; åñëè íóæåí ïàðàìåòð, òî äîñòàòü åãî ìîæíî òàê:
60
;	mov	esi, [esp+4]	; esi = ïàðàìåòð
63
;	mov	esi, [esp+4]	; esi = ïàðàìåòð
61
; òóò êàêèå-òî äåéñòâèÿ
64
; òóò êàêèå-òî äåéñòâèÿ
62
; è âîò ðåçóëüòàò
65
; è âîò ðåçóëüòàò
63
	mov	ecx, [esp+8]	; â [ecx] íóæíî çàïèñàòü äëèíó
66
	mov	ecx, [esp+8]	; â [ecx] íóæíî çàïèñàòü äëèíó
64
	mov	[ecx], length
67
	mov	[ecx], length
65
	mov	eax, buffer
68
	mov	eax, buffer
66
	ret	8
69
	ret	8
-
 
70
 
-
 
71
Àëãîðèòì äëÿ óïàêîâêè äàííûõ:
-
 
72
	1) Âûçîâ ôóíêöèè deflateInit èëè deflateInit2.
-
 
73
	2) Ðàçáèåíèå âõîäíîãî ïîòîêà äàííûõ íà ïîðöèè ïî 64 Êá.
-
 
74
		Äëÿ êàæäîãî áëîêà â 64 Êá â öèêëå äîëæåí äåëàòüñÿ âûçîâ ôóíêöèè deflate.
-
 
75
		Çà îäèí âûçîâ ôóíêöèè deflate ñæàòûõ äàííûõ îáðàçóåòñÿ íå áîëåå 16 Êá.
-
 
76
		Ò. å. åñëè ñæèìàåìûõ äàííûõ ìåíåå 16 Êá, òî èõ ìîæíî óïàêîâàòü çà îäèí âûçîâ deflate.
-
 
77
		Åñëè ñæèìàåìûõ äàííûõ ìåíåå 64 Êá, òî èõ ìîæíî óïàêîâàòü îðãàíèçîâàâ îäèí öèêë ñ âûçîâîì deflate.
-
 
78
		Åñëè ñæèìàåìûõ äàííûõ áîëåå 64 Êá, òî èõ ìîæíî óïàêîâàòü îðãàíèçîâàâ äâîéíîé öèêë ñ âûçîâîì deflate.
-
 
79
	3) Âûçîâ ôóíêöèè deflateEnd äëÿ î÷èñòêè ïàìÿòè.
-
 
80
Çàìå÷àíèÿ:
-
 
81
	Áîëüøèå óðîâíè ñæàòèÿ ïîêà ÷òî íå ïîääåðæèâàþòñÿ.
-
 
82
	Ôóíêöèÿ deflate íå êîðåêòíî ðàáîòàåò ñ ïàðàìåòðîì Z_NO_FLUSH.
-
 
83
	(Ïîêà ïðîáëåìà íå óñòðàíåíà ðåêîìåíäóåòñÿ âñåãäà ñòàâèòü Z_FINISH)