⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lm32_lcc.asm

📁 给出了 zip 压缩算法的完整实现过程。
💻 ASM
字号:
;===========================================================================; Copyright (c) 1990-2005 Info-ZIP.  All rights reserved.;; See the accompanying file LICENSE, version 2004-May-22 or later; (the contents of which are also included in zip.h) for terms of use.; If, for some reason, both of these files are missing, the Info-ZIP license; also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html;===========================================================================; match32.asm by Jean-loup Gailly.; match32.asm, optimized version of longest_match() in deflate.c; To be used only with 32 bit flat model. To simplify the code, the option; -DDYN_ALLOC is not supported.; This file is only optional. If you don't have an assembler, use the; C version (add -DNO_ASM to CFLAGS in makefile and remove match.o; from OBJI). If you have reduced WSIZE in zip.h, then make sure this is; assembled with an equivalent -DWSIZE=<whatever>.;; Win32 (Windows NT) version - 1994/04/13 by Steve Salisbury; * works with Microsoft MASM 6.1X and Microsoft Visual C++ / 32-bit edition;; The code in this file has been copied verbatim from match32.{asm|S};; only the assembler syntax and metacommands have been adapted to; the habits of the free LCC-Win32 C compiler package.; IMPORTANT NOTE to the Info-ZIP editors:; The TAB characters in this source file are required by the parser of; the LCC-Win32 assembler program and MUST NOT be removed!!;;==============================================================================;; Do NOT assemble this source if external crc32 routine from zlib gets used.;;/* This version is for 386 Unix or OS/2 in 32 bit mode.; * Warning: it uses the AT&T syntax: mov source,dest; * This file is only optional. If you want to force the C version,; * add -DNO_ASM to CFLAGS in Makefile and set OBJA to an empty string.; * If you have reduced WSIZE in (g)zip.h, then make sure this is; * assembled with an equivalent -DWSIZE=<whatever>.; * This version assumes static allocation of the arrays (-DDYN_ALLOC not used).; */        .text        .file	"match.S"        .text        .type	_match_init,function_match_init:        ret_$98:        .size	_match_init,_$98-_match_init        .globl	_match_init;/*-----------------------------------------------------------------------; * Set match_start to the longest match starting at the given string and; * return its length. Matches shorter or equal to prev_length are discarded,; * in which case the result is equal to prev_length and match_start is; * garbage.; * IN assertions: cur_match is the head of the hash chain for the current; *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1; */        .align	4        .type	_longest_match,function_longest_match: ;/* int longest_match(cur_match) */;       cur_match     equ 20(%esp);     /* return address */               /* esp+16 */        push    %ebp        push    %edi;/* esp+8  */        push    %esi;/* esp+4  */        push    %ebx;/* esp    */;/*; *      match        equ esi; *      scan         equ edi; *      chain_length equ ebp; *      best_len     equ ebx; *      limit        equ edx; */        mov     20(%esp),%esi        mov     _strstart,%edx        mov     _max_chain_length,%ebp        mov     %edx,%edi        sub     $(32768-262),%edx        cld        jae     limit_ok        sub     %edx,%edxlimit_ok:        add     $2+_window,%edi        mov     _prev_length,%ebx        movw    -2(%edi),%cx        movw    -3(%ebx,%edi),%ax        cmp     _good_match,%ebx        jb      do_scan        shr     $2,%ebp        jmp     do_scan        .align	4long_loop:;/* at this point, edi == scan+2, esi == cur_match */        movw    -3(%ebx,%edi),%ax        movw     -2(%edi),%cxshort_loop:;/*; * at this point, di == scan+2, si == cur_match,; * ax = scan[best_len-1..best_len] and cx = scan[0..1]; */        and     $(32768-1), %esi        dec     %ebp        movw    _prev(,%esi,2),%si        jz      the_end        cmp     %edx,%esi        jbe     the_enddo_scan:        cmpw    _window-1(%ebx,%esi),%ax        jne     short_loop        cmpw    _window(%esi),%cx        jne     short_loop        add     $2+_window,%esi        mov     $((258>>1)-1),%ecx        mov     %edi,%eax        repe;   cmpsw;/* loop until mismatch */        je      maxmatch;/* match of length MAX_MATCH? */mismatch:        movb    -2(%edi),%cl        xchg    %edi,%eax        subb    -2(%esi),%cl        sub     %edi,%eax        sub     $2+_window,%esi        sub     %eax,%esi        subb    $1,%cl        adc     $0,%eax        cmp     %ebx,%eax        jle     long_loop        mov     %esi,_match_start        mov     %eax,%ebx        cmp     _nice_match,%eax; /* len >= nice_match ? */        jl      long_loopthe_end:        mov     %ebx,%eax        pop     %ebx        pop     %esi        pop     %edi        pop     %ebp        ret        .align	4maxmatch:        cmpsb        jmp     mismatch_$99:        .size	_longest_match,_$99-_longest_match        .globl	_longest_match        .extern	_nice_match        .extern	_good_match        .extern	_max_chain_length        .extern	_match_start        .extern	_strstart        .extern	_prev_length        .extern	_prev        .extern	_window

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -