Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

CRC32 help requested

11 views
Skip to first unread message

Andy

unread,
Oct 26, 2009, 2:06:26 PM10/26/09
to

I am trying to change this 16 bit code to use 32 bit registers so it
will work with larger files.
It isn't working right.

Can someone help me with it?
I am also trying to understand what the les statement is doing.

Thanks.


; crc.asm - Performs a CRC on files
;
.MODEL SMALL
.486
.stack 200h

.data

initcrc dd 0FFFFFFFFh ;Initial CRC value
filename db "intel.txt",0
crlf db 0Dh,0Ah,24h
hndl dw 0 ;File handle storage.
buf dd 0 ;Dynamic storage. Do not move!

;*****************************************************
; 32 bit reverse crc table for polynomial EDB88320h (Zmodem,PKZip)
; X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0

crc32tab dd 000000000h, 077073096h, 0ee0e612ch, 0990951bah,
0076dc419h
dd 0706af48fh, 0e963a535h, 09e6495a3h, 00edb8832h,
079dcb8a4h
dd 0e0d5e91eh, 097d2d988h, 009b64c2bh, 07eb17cbdh,
0e7b82d07h
dd 090bf1d91h, 01db71064h, 06ab020f2h, 0f3b97148h,
084be41deh
dd 01adad47dh, 06ddde4ebh, 0f4d4b551h, 083d385c7h,
0136c9856h
dd 0646ba8c0h, 0fd62f97ah, 08a65c9ech, 014015c4fh,
063066cd9h
dd 0fa0f3d63h, 08d080df5h, 03b6e20c8h, 04c69105eh,
0d56041e4h
dd 0a2677172h, 03c03e4d1h, 04b04d447h, 0d20d85fdh,
0a50ab56bh
dd 035b5a8fah, 042b2986ch, 0dbbbc9d6h, 0acbcf940h,
032d86ce3h
dd 045df5c75h, 0dcd60dcfh, 0abd13d59h, 026d930ach,
051de003ah
dd 0c8d75180h, 0bfd06116h, 021b4f4b5h, 056b3c423h,
0cfba9599h
dd 0b8bda50fh, 02802b89eh, 05f058808h, 0c60cd9b2h,
0b10be924h
dd 02f6f7c87h, 058684c11h, 0c1611dabh, 0b6662d3dh,
076dc4190h
dd 001db7106h, 098d220bch, 0efd5102ah, 071b18589h,
006b6b51fh
dd 09fbfe4a5h, 0e8b8d433h, 07807c9a2h, 00f00f934h,
09609a88eh
dd 0e10e9818h, 07f6a0dbbh, 0086d3d2dh, 091646c97h,
0e6635c01h
dd 06b6b51f4h, 01c6c6162h, 0856530d8h, 0f262004eh,
06c0695edh
dd 01b01a57bh, 08208f4c1h, 0f50fc457h, 065b0d9c6h,
012b7e950h
dd 08bbeb8eah, 0fcb9887ch, 062dd1ddfh, 015da2d49h,
08cd37cf3h
dd 0fbd44c65h, 04db26158h, 03ab551ceh, 0a3bc0074h,
0d4bb30e2h
dd 04adfa541h, 03dd895d7h, 0a4d1c46dh, 0d3d6f4fbh,
04369e96ah
dd 0346ed9fch, 0ad678846h, 0da60b8d0h, 044042d73h,
033031de5h
dd 0aa0a4c5fh, 0dd0d7cc9h, 05005713ch, 0270241aah,
0be0b1010h
dd 0c90c2086h, 05768b525h, 0206f85b3h, 0b966d409h,
0ce61e49fh
dd 05edef90eh, 029d9c998h, 0b0d09822h, 0c7d7a8b4h,
059b33d17h
dd 02eb40d81h, 0b7bd5c3bh, 0c0ba6cadh, 0edb88320h,
09abfb3b6h
dd 003b6e20ch, 074b1d29ah, 0ead54739h, 09dd277afh,
004db2615h
dd 073dc1683h, 0e3630b12h, 094643b84h, 00d6d6a3eh,
07a6a5aa8h
dd 0e40ecf0bh, 09309ff9dh, 00a00ae27h, 07d079eb1h,
0f00f9344h
dd 08708a3d2h, 01e01f268h, 06906c2feh, 0f762575dh,
0806567cbh
dd 0196c3671h, 06e6b06e7h, 0fed41b76h, 089d32be0h,
010da7a5ah
dd 067dd4acch, 0f9b9df6fh, 08ebeeff9h, 017b7be43h,
060b08ed5h
dd 0d6d6a3e8h, 0a1d1937eh, 038d8c2c4h, 04fdff252h,
0d1bb67f1h
dd 0a6bc5767h, 03fb506ddh, 048b2364bh, 0d80d2bdah,
0af0a1b4ch
dd 036034af6h, 041047a60h, 0df60efc3h, 0a867df55h,
0316e8eefh
dd 04669be79h, 0cb61b38ch, 0bc66831ah, 0256fd2a0h,
05268e236h
dd 0cc0c7795h, 0bb0b4703h, 0220216b9h, 05505262fh,
0c5ba3bbeh
dd 0b2bd0b28h, 02bb45a92h, 05cb36a04h, 0c2d7ffa7h,
0b5d0cf31h
dd 02cd99e8bh, 05bdeae1dh, 09b64c2b0h, 0ec63f226h,
0756aa39ch
dd 0026d930ah, 09c0906a9h, 0eb0e363fh, 072076785h,
005005713h
dd 095bf4a82h, 0e2b87a14h, 07bb12baeh, 00cb61b38h,
092d28e9bh
dd 0e5d5be0dh, 07cdcefb7h, 00bdbdf21h, 086d3d2d4h,
0f1d4e242h
dd 068ddb3f8h, 01fda836eh, 081be16cdh, 0f6b9265bh,
06fb077e1h
dd 018b74777h, 088085ae6h, 0ff0f6a70h, 066063bcah,
011010b5ch
dd 08f659effh, 0f862ae69h, 0616bffd3h, 0166ccf45h,
0a00ae278h
dd 0d70dd2eeh, 04e048354h, 03903b3c2h, 0a7672661h,
0d06016f7h
dd 04969474dh, 03e6e77dbh, 0aed16a4ah, 0d9d65adch,
040df0b66h
dd 037d83bf0h, 0a9bcae53h, 0debb9ec5h, 047b2cf7fh,
030b5ffe9h
dd 0bdbdf21ch, 0cabac28ah, 053b39330h, 024b4a3a6h,
0bad03605h
dd 0cdd70693h, 054de5729h, 023d967bfh, 0b3667a2eh,
0c4614ab8h
dd 05d681b02h, 02a6f2b94h, 0b40bbe37h, 0c30c8ea1h,
05a05df1bh
dd 02d02ef8dh

.code

begin:

mov ax,@data
mov ds,ax

mov ax,03D00h ;Open for read.
lea dx,filename ;Filename in default DTA
(PSP)
int 21h
;jc error2
mov word ptr [hndl],ax
read:
mov ah,03Fh
mov bx,word ptr [hndl]
mov edx,offset buf
mov ecx,0FFFFFFFFh ;Leave room in buffer for
stack.
sub ecx,edx ;Maximum buffer size.
int 21h
;jc error3
; File size is in eax
or eax,eax ;End of file?
je exit

call UpdateCRC32 ;calculate CRC.
jmp read
exit:
xor word ptr [initcrc],0FFFFh ;Finish CRC calculation.
xor word ptr [initcrc+2],0FFFFh
mov eax,dword ptr [initcrc+2]
call bin2hex ;Print CRC to screen.
mov eax,dword ptr [initcrc]
call bin2hex
mov ax,0FFFFh
mov dword ptr[initcrc],eax
mov dword ptr[initcrc+2],eax
mov dx,offset CRLF ;linefeed
mov ah,09h
int 21h
close:
mov bx,word ptr [hndl]
mov ah,3Eh ;close file.
int 21h
;
; mov ah,4Fh ;Do more files.
; int 21h
; jc toDOS
; jmp findnext
toDOS:
mov ax,04C00h ;Normal exit to DOS.
int 21h

bin2hex proc near

;Convert AX to HEX ASCII output

bin2he: mov cx,4 ;4 hex digits
mov bx,10h ;divisor
bin2h1: xor dx,dx ;zero DX for 16 bit divide
div bx ;leaves quotient in AX
add dl,'0' ;convert remainder to ASCII
cmp dl,'9'
jna bin2h2
add dl,'A'-'9'-1
bin2h2: push dx ;put on stack
loop bin2h1 ;repeat
mov cx,4
bin2h3: pop ax ;pop most significant digit
first
mov dl,al
mov ah,02h
int 21h
loop bin2h3
ret
bin2hex endp

UpdateCRC32 proc near

; UpdateCRC32 takes an initial CRC value and updates it from
; data in 'buf'. The updated CRC is then stored in InitCRC.

mov si,offset buf
mov cx,ax
jcxz bye
les ax,[initcrc]
mov dx,ES
lo2:
xor bh,bh
mov bl,al
lodsb
xor bl,al
mov al,ah
mov ah,dl
mov dl,dh
xor dh,dh
shl bx,1
shl bx,1
les bx,[crc32tab+bx]
xor ax,bx
mov bx,ES
xor dx,bx
loop lo2
mov [initcrc],eax ; Store result in InitCRC
mov [initcrc+2],edx
bye:
ret
UpdateCRC32 endp

end begin

Helge Kruse

unread,
Oct 26, 2009, 7:16:46 PM10/26/09
to

Andy schrieb:

> I am trying to change this 16 bit code to use 32 bit registers so it
> will work with larger files.
> It isn't working right.
Is the 16 bit code not working right that you want to use as starting
point or is there a problem with your new code?

> I am also trying to understand what the les statement is doing.

les ax,[somedata]
mov dx,es

This instruction reads 32 bits to ES and AX. "Load ES and AX with.." can
be used as mnemomic. It's a way to read 32 bits that should be much
easier in 32bit environment.

Regards,
Helge

ArarghMai...@not.at.arargh.com

unread,
Oct 26, 2009, 9:04:23 PM10/26/09
to

On 26 Oct 2009 23:16:46 GMT, Helge Kruse <Helge.Kru...@gmx.net>
wrote:

Probably not very safe in a 32bit environment as I think the h/o 16
bits of DX remain unchanged. Unless that's what you WANT. :-)
--
ArarghMail910 at [drop the 'http://www.' from ->] http://www.arargh.com
BCET Basic Compiler Page: http://www.arargh.com/basic/index.html

To reply by email, remove the extra stuff from the reply address.

Helge Kruse

unread,
Oct 27, 2009, 8:29:52 AM10/27/09
to

<ArarghMai...@NOT.AT.Arargh.com> wrote in message
news:4ae64716$0$5105$9a6e...@unlimited.newshosting.com...

>>> I am also trying to understand what the les statement is doing.

>>This instruction reads 32 bits to ES and AX. "Load ES and AX with.." can
>>be used as mnemomic. It's a way to read 32 bits that should be much
>>easier in 32bit environment.
>
> Probably not very safe in a 32bit environment as I think the h/o 16
> bits of DX remain unchanged. Unless that's what you WANT. :-)

I think it's not even "not very safe" but impossible in 32 bit mode. I just
described what the 16 bit code does.

The OP wants to port this code to 32 bits:


> I am trying to change this 16 bit code to use 32 bit registers so it
> will work with larger files.

When I would change the code to use 32 bits, I would write it from scratch
but inspired by the original code.

Regards,
Helge


ArarghMai...@not.at.arargh.com

unread,
Oct 27, 2009, 7:19:50 PM10/27/09
to

On 27 Oct 2009 12:29:52 GMT, "Helge Kruse"
<Helge.Kru...@gmx.net> wrote:

>
>
><ArarghMai...@NOT.AT.Arargh.com> wrote in message
>news:4ae64716$0$5105$9a6e...@unlimited.newshosting.com...
>
>>>> I am also trying to understand what the les statement is doing.
>>>This instruction reads 32 bits to ES and AX. "Load ES and AX with.." can
>>>be used as mnemomic. It's a way to read 32 bits that should be much
>>>easier in 32bit environment.
>>
>> Probably not very safe in a 32bit environment as I think the h/o 16
>> bits of DX remain unchanged. Unless that's what you WANT. :-)

DX should be EDX.


>
>I think it's not even "not very safe" but impossible in 32 bit mode. I just
>described what the 16 bit code does.

Well, it does assemble:
.model flat,stdcall
00000000 .code
00000000 66| 8C C2 mov dx,es

so, I presume it would run.

>The OP wants to port this code to 32 bits:
>> I am trying to change this 16 bit code to use 32 bit registers so it
>> will work with larger files.
>
>When I would change the code to use 32 bits, I would write it from scratch
>but inspired by the original code.

Yes, I also.

In the case of the CRC32 routine, I just use the one from zlib - much
easier. :-)

Andy

unread,
Oct 28, 2009, 2:59:46 PM10/28/09
to

On Oct 27, 7:29=A0am, "Helge Kruse" <Helge.Kruse-nos...@gmx.net> wrote:
> <ArarghMail910NOS...@NOT.AT.Arargh.com> wrote in message

>
> news:4ae64716$0$5105$9a6e...@unlimited.newshosting.com...
>
> >>> I am also trying to understand what the les statement is doing.
> >>This instruction reads 32 bits to ES and AX. "Load ES and AX with.." ca=

n
> >>be used as mnemomic. It's a way to read 32 bits that should be much
> >>easier in 32bit environment.
>
> > Probably not very safe in a 32bit environment as I think the h/o 16
> > bits of DX remain unchanged. =A0Unless that's what you WANT. =A0:-)
>
> I think it's not even "not very safe" but impossible in 32 bit mode. I ju=
st

> described what the 16 bit code does.
>
> The OP wants to port this code to 32 bits:
>
> > I am trying to change this 16 bit code to use 32 bit registers so it
> > will work with larger files.
>
> When I would change the code to use 32 bits, I would write it from scratc=
h

> but inspired by the original code.
>
> Regards,
> Helge

I found out that the code does work just fine, even on large files.

Andy

Windows has some built in functions that work better.

; checksum.asm Simple method of checking if a file has been altered.
; Tuesday, October 27, 2009
; Help from MichaelW,Hutch,Vortex,
;
.486
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\Comctl32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\shell32.inc
include \masm32\include\oleaut32.inc
include \masm32\include\ole32.inc
include \masm32\include\msvcrt.inc
include \masm32\include\dialogs.inc

include \masm32\macros\macros.asm

includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\Comctl32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\oleaut32.lib
includelib \masm32\lib\ole32.lib
includelib \masm32\lib\msvcrt.lib

include \masm32\include\imagehlp.inc
includelib \masm32\lib\imagehlp.lib

.DATA

szFileName db "C:\masm32\SOURCE\INTERRUPTS.asm",0
szAppName db "Box",0
headerSum dd 0
checkSum dd 0
szFileChanged db "The file has changed.",0
szFile_OK db "File has not been altered.",0
StoreChkSum dd 0 ;
Garbage dd 321h ; Flak
Orig_ChkSum dd 576623h ; This value HAS to be the reverse of how
it's stored in memory!!
; Value of UNaltered file
; Hide and obfuscate this and make name
"Non-sensical"
.data?

dwHeaderSum dw ?
hWnd dd ?
dwCheckSum dd ?

.CODE

start:

invoke MapFileAndCheckSumA, ADDR szFileName, ; Do a checksum of our
file
ADDR headerSum, ; Requires imagehlp.inc
and imagehlp.lib
ADDR checkSum

mov EAX,checkSum
mov StoreChkSum,EAX ; Store value for later use

.if eax =3D=3D Orig_ChkSum ; Check if file has been altered
invoke MessageBox, NULL, addr szFile_OK, addr szAppName,MB_OK

.else

invoke MessageBox,NULL,addr szFileChanged,addr szAppName,MB_OK

.endif

invoke ExitProcess,0

end start

0 new messages