Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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