; Opt2 Optimisation finale du compteur de mots ; Ecrit par Michael Abrash ; Modifié par Willem Clements ; C/ Moncayo 5, Laurel de la Reina ; 18140 La Zubia ; Granada ; Spain ; Tel 34-58-890398 ; Fax 34-58-224102 ; parms struc dw 2 dup(?) buffer dw ? bufferlength dw ? charflag dw ? wordcount dw ? parms ends .model small .data charstatustable label byte rept 2 db 39 dup(0) db 1 db 8 dup(0) db 10 dup(1) db 7 dup(0) db 26 dup(1) db 6 dup(0) db 26 dup(1) db 5 dup(0) endm .code public _ScanBuffer _ScanBuffer proc near push bp mov bp,sp push si push di mov si,[bp+buffer] mov bx,[bp+charflag] mov al,[bx] mov cx,[bp+bufferlength] mov bx,offset charstatustable xor di,di ; compteur de mots est à 0 shr cx,1 ; change le compteur en compteur ; de mots jc oddentry ; nombre d'octets impairs à ; traiter cmp al,01h ; vérifie si le dernier octet ; est un caractère jne scanloop4 ; si ce n'est pas le cas, ; rechercher un caractère jmp scanloop1 ; si c'est le cas, recherche 0 oddentry: xchg al,ah ; le dernier est dans ah lodsb ; récupère le premier octet inc cx cmp ah,01h ; vérifie si le dernier est un ; caractère jne scanloop5 ; si ce n'est pas le cas, ; recherche un caractère jmp scanloop2 ; si c'est le cas, recherche 0 ; ; détermine la fin d'un mot ; scanloop1: lodsw ; récupère deux caractères xlat ; convertit le premier xchg al,ah ; le premier est dans ah scanloop2: xlat ; convertit le second dec cx ; décompte jz done1 ; il ne reste plus d'octets cmp ax,0101h ; vérifie si ce sont deux ; caractères je scanloop1 ; passe aux octets suivants inc di ; augmente le compteur de mots cmp al,01h ; vérifie si le nouveau mot est ; recherché je scanloop1 ; localise la fin du mot ; ; locate the begin of a word ; scanloop4: lodsw ; récupère deux caractères xlat ; convertit le premier xchg al,ah ; le premier est dans ah scanloop5: xlat ; convertit le second dec cx ; décompte jz done2 ; il ne reste plus d'octets cmp ax,0 ; vérifie si le mot est recherché je scanloop4 ; si ce n'est pas le cas, localise ; le début cmp al,01h ; vérifie le mot d'une lettre je scanloop1 ; si ce n'est pas le cas, localise ; la fin du mot inc di ; augmente le compteur de mots jmp scanloop4 ; localise le début du prochain ; mot done1: cmp ax,0101h ; vérifie si c'est la fin du mot je done ; si ce n'est pas le cas, nous ; avons terminé inc di ; accroît le compteur de mots jmp done done2: cmp ax,0100h ; vérifie si c'est un mot d'une ; lettre jne done ; si ce n'est pas le cas, nous ; avons fini inc di ; augmente le compteur de mots done: mov si,[bp+charflag] mov [si],al mov bx,[bp+wordcount] mov ax,[bx] mov dx,[bx+2] add di,ax adc dx,0 mov [bx],di mov [bx+2],dx pop di pop si pop bp ret _ScanBuffer endp end