; *** Listing 1-7 *** ; ; Routine assembleur pour calculer la somme(checksum) sur 16 bits pour un ; bloc d'octets de 1 à 64K. Additionne la somme checksum dans ; le paramètre checksum. ; ;Syntaxe d'appel: ; void ChecksumChunk(unsigned char *Buffer, ; unsigned int BufferLength, unsigned int *Checksum); ; ;où: ; Buffer = pointeur sur le début du bloc d'octets à sommer ; BufferLength = nombre d'octets(0 signifie 64K, et non 0) ; Checksum = pointeur sur la variable unsigned int stockant la somme ; ; Structure des paramètres: ; Parms struc dw ? ; BP empilé dw ? ; adresse de retour Buffer dw ? BufferLength dw ? Checksum dw ? Parms ends ; .model small .code public _ChecksumChunk _ChecksumChunk proc near push bp mov bp,sp push si ;sauve les variables registre C ; cld ;LODSB incremente SI mov si,[bp+Buffer] ;pointe sur le tampon mov cx,[bp+BufferLength] ;récupère la longueur du ;tampon mov bx,[bp+Checksum] ;pointe sur la variable ;checksum mov dx,[bx] ;récupère la somme courante sub ah,ah ;AX aura une valeur sur 16 bits ;après LODSB ChecksumLoop: lodsb ;récupère le prochain octet add dx,ax ;l'ajoute au total de la somme loop ChecksumLoop ;continue pour les autres octets ;du bloc mov [bx],dx ;sauve la nouvelle somme pop si ;restaure la variable registre C pop bp ret _ChecksumChunk endp end