Version 2.0 Aktualisiert: 30.03.04



Dieses Programm ersetzt das alte "free" Programm (das wohl nirgendwo mehr funktioniert) und soll vor allem zeigen wie man mit großen Dateien umgeht. Dabei soll von einer Datei die CRC16 errechnet werden. Von der Datei wird zunächst ein Stück in den vorher reservierten Speicher eingelesen und dann davon die CRC brechnet. Dann wird abermals ein Stück eingelesen, wobei die CRC mit dem vorherigen Wert weiterarbeitet. So werden so lange Daten eingelesen, bis in AX durch eine 0 signalisiert wird, daß wir alles eingelesen haben. Da mehrfach eingelesen wird, ist die Dateigröße nicht auf 64 kByte begrenzt, sondern kann mehrere MByte betragen. Das Programm benutzt Prozeduren und Makros aus meinem Buch im MITP Verlag und eine CRC16-Prozedur aus dem Buch von Günter Born (eine CD).
Syntax: CRC16 filename.ext .
Schon eine kleine Veränderung der Datei an einer beliebigen Stelle, bewirkt eine ganz andere CRC.
Das Programm benötigt die Datei macro.inc welche unten als Download bereitsteht!

Programm für eine EXE Datei:
		.MODEL SMALL
		.386
                .STACK 100h
                .DATA
Filename        DB 126 DUP (0)		;Kommandozeile
Segment2        DW  ?
Puffer1		DB 6 DUP (?)   ;Puffer für das Resultat

;**********************************ANFANG CODE **************************************************

                .CODE
		include macro.inc
		CutMem
                Gettail Filename,Fehler		;Kommandozeile mit Dateiname
		call InitData1
                mov  al,00h
                mov  ah,3Dh
		mov  dx,OFFSET Filename
                int  21h			;Datei oeffnen
		mov  bx,ax
		jc   Fehler
					
		AllocMem 0FFFh
		mov  [Segment2],ax		;Speicher res.
		
		call InitFardata
		xor  dx,dx

LoopIt:
		push dx
		mov  ah,3Fh
		mov  cx,0EFFFh
		mov  dx,0
                int  21h			;Daten einlesen
		jc   Fehler
		
		pop  dx

		cmp  ax,0			;Fertig mit den Daten
		je   Raus			;bzw. der Datei?

		mov  cx,ax
		mov  si,0

		call CRC16			;CRC ausrechnen
		jmp  LoopIt			;Nächste Dateiportion!

Raus:
		mov  ah,3Eh
		int  21h
		
		push ds
		pop  es
		mov  ah,49h
		int  21h			;Speicher wieder freigeben

		call InitData1
		push ds
		pop  es
		mov  ax,dx
		call Ausgabe

Fehler:	
		mov  ah,4Ch
		int  21h			;Ende Programm


InitData1       PROC NEAR
                push ax
                mov  ax,@data
                mov  ds,ax
		;ASSUME DS:@data
		pop  ax
		ret
InitData1       ENDP


InitFardata          PROC NEAR
                     push ax
		     mov  ax,[Segment2]		;DS auf Segment 2 
		     mov  ds,ax
		     pop  ax
		     ret
InitFardata	     ENDP

; -->Aus Buch: Assembler Programmierung - Günter Born:
; Pass    - DS:SI = pointer to the buffer
;         - CX    = length of the buffer 
; Returns - DX    = CRC16 of the buffer  

CRC16    PROC NEAR

         PUSH AX
         PUSH BX
         PUSHF
         CLD                      ; Move forward through the buffer

         ;SUB  DX,DX               ; CRC := 0000h ; von mir auskommentiert

C1:      LODSB                    ; AL := byte at DS:SI
         SUB  AH,AH

         XCHG AH,AL               ; AX := 256 * AL
         XOR  DX,AX               ; CRC := CRC xor AX

         PUSH CX
         MOV  CX,8

C2:      MOV  BX,DX
         SHL  DX,1

         AND  BX,8000h
         JZ   C3

         XOR  DX,1021h
C3:      LOOP C2
         POP  CX

         LOOP C1

         POPF
         POP  BX
         POP  AX
         RET
CRC16    ENDP


;--> Aus Buch: Assembler - Grundlagen der Programmierung, Roming, Rhode:
Ausgabe  PROC NEAR      ;Ausgabeprozedur
         pusha          ;Register sichern
         xor  cx,cx     ;CX=0=Zeichenzähler
         mov  di,OFFSET Puffer1+6  ;DI an Pufferende
         mov  bx,10     ;Nachher durch 10 dividieren

Loop1:   xor  dx,dx     ;DX=0
         div  bx        ;AX/10, Rest in DX bzw. DL
         add  dl,30h    ;DL nach ASCII
         dec  di        ;DI-1
         mov  [di],dl   ;ASCII Ziffer in Puffer
         inc  cx        ;CX+1
         cmp  ax,0      ;Ist AX=0 ?
         jne  Loop1     ;Springe wenn nein

         mov  ah,40h    ;Funktionsnummer
         mov  bx,1      ;Handle-Nummer
         mov  dx,di     ;DS:DX auf String!
         int  21h       ;ASCII-Zahl ausgeben!
         popa           ;Register wiederherstellen
         ret            ;und zurück!
Ausgabe  ENDP           ;Ende Prozedur

	END

--> Erstellen der EXE-Datei mit TASM Dateiname und TLINK Dateiname
Bsp.: Ihre Datei heisst CRC16.asm, tippen sie also: Tasm CRC16 [Return] und dann tlink CRC16 [Return].

Download: Programm inclusive Macro.inc
Weiter geht es hier!

Zurück Weiter Inhalt