; Routine Assembleur pour le Listing 16.2. Parcourt un tampon, de ; longueur BufferLength, en comptant les mots puis met à jour WordCount ; BufferLength doit être > 0. *CharFlag et *WordCount ; doivent être=0 au premier appel. Testé avec TASM. ; Appelable en C near comme suit: ; void ScanBuffer(char *Buffer, unsigned int BufferLength, ; char *CharFlag, unsigned long *WordCount); parms struc dw 2 dup(?) ;adresse de retour & BP empilés Buffer dw ? ;tampon à analyser BufferLength dw ? ;longueur du tampon à analyser CharFlag dw ? ;pointeur sur le drapeau du dernier ;caractère traité en entrée(0 à l'appel ;initial). Mis à jour en sortie WordCount dw ? ;pointeur sur compteur de mots sur 32 bits ;trouvé (0 au premier appel) parms ends .model small .code public _ScanBuffer _ScanBuffer proc near push bp ;préserve la stack frame de l'appelant mov bp,sp ;configure la stack frame localement push si ;préserve les variables registre de l'appelant push di mov si,[bp+Buffer] ;pointe sur le tampon à analyser mov bx,[bp+WordCount] mov cx,[bx] ;récupère le compteur de mots courant sur 32 bits mov dx,[bx+2] mov bx,[bp+CharFlag] mov bl,[bx] ;récupère CharFlag courant mov di,[bp+BufferLength] ;récupère le nombre d'octets à analyser ScanLoop: mov bh,bl ;PredCharFlag = CharFlag; lodsb ;Ch = *BufferPtr++ & 0x7F; and al,7fh ;gère le bit de poids fort du processeur de mots ;qui le paramètre en tant que drapeau interne mov bl,1 ;suppose que c'est un caractère; CharFlag = 1; cmp al,'a' ;c'est un caractère s'il est entre a et z jb CheckAZ cmp al,'z' jna IsAChar CheckAZ: cmp al,'A' ;c'est un caractère s'il est entre A et Z jb Check09 cmp al,'Z' jna IsAChar Check09: cmp al,'0' ;c'est un caractère s'il est entre 0 et 9 jb CheckApostrophe cmp al,'9' jna IsAChar CheckApostrophe: cmp al,27h ;c'est un caractère si c'est une apostrophe jz IsAChar sub bl,bl ;pas de caractère; CharFlag = 0; and bh,bh jz ScanLoopBottom ;si ((!CharFlag) && PredCharFlag) { add cx,1 ; (WordCount)++; adc dx,0 ;} IsAChar: ScanLoopBottom: dec di ;} while (--BufferLength); jnz ScanLoop mov si,[bp+CharFlag] mov [si],bl ;paramètre un nouveau CharFlag mov bx,[bp+WordCount] mov [bx],cx ;paramètre un nouveau compteur de mots mov [bx+2],dx pop di ;restaure les variables registres de l'appelant pop si pop bp ;restaure la stack frame de l'appelant ret _ScanBuffer endp end