Algorithm 版 (精华区)

发信人: lofe ()感激生活(), 信区: Algorithm
标  题: Fin--comp2.asm
发信站: 哈工大紫丁香 (Sun Sep  3 16:03:28 2000), 转信



; Copyright 1991 by Jussi Puttonen, Timo Raita and Jukka Teuhola

; Written by Jussi Puttonen, 19.4.1991 at University of Turku, Finland
; Algorithms suggested by Timo Raita and Jukka Teuhola


InFile equ 0
OutFile equ 1

ReadBufferSize  equ 16384
WriteBufferSize equ 16384

stack segment stack 'stack'
  db 1024 dup (?)
stack ends

data segment para public 'data'

FailString db 'COMP failed.', 10,13, '$'

  align

ReadBuffer db ReadBufferSize dup (?)
ReadBufferEnd label byte
ReadSize  dw ?
  align

WriteBuffer db WriteBufferSize dup (?)
WriteBufferEnd label byte
ExtraWriteBuffer db 10 dup (?)

data ends

table segment para public 'data'
 db 8000h dup (' ')
 db 8000h dup (' ')
table ends

code segment para public 'code'
 assume cs:code, ds:data, es:table

; FlushBuffer must be called at the end of the program

WriteBlock: push ax
   push bx
   push cx
   push dx
   mov ah, 40h
   mov bx, OutFile
   mov cx, WriteBufferSize
   lea dx, WriteBuffer
   int 21h

; take care of the ExtraWriteBuffer
   mov cx, di
   mov di, offset WriteBuffer
   sub cx, offset WriteBufferEnd
   je ExtraHandled
   mov bx, offset WriteBufferEnd
ExtraCopyLoop: mov al, ds:[bx]
   mov ds:[di], al
   inc bx
   inc di
   loop ExtraCopyLoop
ExtraHandled: pop dx
   pop cx
   pop bx
   pop ax
   ret

FlushBuffer proc
   mov ah, 40h
   mov bx, OutFile
   mov cx, di
   lea dx, WriteBuffer
   sub cx, dx
   int 21h
   ret
FlushBuffer endp

; register use:
;   bx address
;   si pointer to ReadBuffer
;   di pointer to WriteBuffer
;   dl Bits
;   bp SavedWriteLoc

jProcessLastBytes:
   jmp ProcessLastBytes
Start:  cld
   mov ax, data
   mov ds, ax
   mov ax, table
   mov es, ax

   mov bx, 0
   mov di, offset WriteBuffer

ReadBlockLoop: mov dx, offset ReadBuffer
   mov si, dx    ; to be used in ProcessBlockLoop
   push bx
   mov bx, InFile
   mov ah, 3Fh
   mov cx, ReadBufferSize
   int 21h
   jnc ReadSuccess
   jmp fail
ReadSuccess: pop bx
   mov ReadSize, ax
   mov cl, 3
   shr ax, cl
   je jProcessLastBytes
   mov cx, ax

ProcessByte macro SourceReg,BitVal
   local over
   cmp SourceReg, es:[bx]
   je over
   or dl, BitVal
   mov es:[bx], SourceReg
   mov ds:[di], SourceReg
   inc di
over:  mov bh, bl
   mov bl, SourceReg
   endm


ProcessBlockLoop:
   mov bp, di
   inc di
   xor dl, dl
   lodsw
   ProcessByte al, 80h
   ProcessByte ah, 40h
   lodsw
   ProcessByte al, 20h
   ProcessByte ah, 10h
   lodsw
   ProcessByte al, 08h
   ProcessByte ah, 04h
   lodsw
   ProcessByte al, 02h
   ProcessByte ah, 01h

   mov ds:[bp], dl

   cmp di, offset WriteBufferEnd
   jb NoWriteBlock
   call WriteBlock
NoWriteBlock: loop jProcessBlockLoop
   jmp jNext1
jProcessBlockLoop:
   jmp ProcessBlockLoop
jNext1:  mov ax, ReadSize
   cmp ax, ReadBufferSize
   jne ProcessLastBytes
   jmp ReadBlockLoop
ProcessLastBytes:
   mov cx, ReadSize
   and cx, 7
   je Finish
   mov bp, di
   inc di
LastByteLoop: lodsb
   shl dl, 1
   cmp al, es:[bx]
   je over
   inc dl
   mov es:[bx], al
   mov ds:[di], al
   inc di
over:  mov bh, bl
   mov bl, al
   loop LastByteLoop

   mov cx, 8
   sub cx, ReadSize
   and cx, 7
   je NoShift
ShiftLoop: shl dl, 1
   inc dl
   loop ShiftLoop

NoShift:  mov ds:[bp], dl

Finish:  call FlushBuffer

   mov ax, 4c00h
   int 21h

fail:  mov dx, offset FailString
   mov ah, 9
   int 21h
   mov ax, 4c01h
   int 21h


   code ends

  end Start

--
          ┌─                           ─┐
             Every problem has a solution.
          └─                           ─┘

infosite@263.net
http://infosite.topcool.net
※ 修改:.haojs 于 Sep  3 16:01:00 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
※ 修改:·lofe 於 09月03日16:07:46 修改本文·[FROM: 202.118.226.15]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.551毫秒