; *** Listing 1-3 *** ; ; Sous-routine Assembleur pour calculer la somme de checksum sur 16 bits pour ; le fichier ouvert transmis par handle. Stocke le résultat dans la variable ; checksum transmise. Retourne à 1 si réussite, à 0 si erreur. ; ;Syntaxe d'appel: ; int ChecksumFile(unsigned int Handle, unsigned int *Checksum); ; ;où : ; Handle = N° de handle du fichier déjà ouvert ; Checksum = pointeur sur variable unsigned int stockant ; la valeur checksum calculée ; ; Structure des paramètres: ; Parms struc Dw ? ; BP empilé Dw ? ; adresse de retour Handle dw ? Checksum dw ? Parms ends ; .model small .data TempWord label word TempByte db ? ;chaque octet lu par DOS sera ;stocké ici db 0 ;octet de poids fort de TempWord toujours à 0 ;si addition sur 16 bits ; .code public _ChecksumFile _ChecksumFile proc near push bp mov bp,sp push si ;sauve les variables registre C ; mov bx,[bp+Handle] ;récupère le handle du fichier sub si,si ;zéro de l'accumulateur checksum mov cx,1 ;demande un octet par lecture mov dx,offset TempByte ;pointe DX sur l'octet ; stockant la lecture de DOS ChecksumLoop: mov ah,3fh ;fonction de lecture fichier du DOS # int 21h ;lit l'octet jc ErrorEnd ;si erreur and ax,ax ;un octet lu ? jz Success ;pas en fin de fichier -OK add si,[TempWord] ;ajoute l'octet dans le total checksum jmp ChecksumLoopErrorEnd: sub ax,ax ;erreur jmp short Done Success: mov bx,[bp+Checksum] ;pointe sur la variable checksum mov [bx],si ;sauve la nouvelle valeur checksum mov ax,1 ;réussite ; Done: pop si ;restaure la variable registre C pop bp ret _ChecksumFile endp end