; *** Listing 7.2 *** ; ; Programme pour illustrer la rechercher dans un tampon de longueur ; spécifiée pour trouver un octet spécifié ou un octet zéro. ; Une boucle est déroulée quatre fois et terminée par LOOP. .model small .stack 100h .data ; Chaîne test à rechercher. SampleString label byte db 'Cette chaîne est suffisamment longue ' db 'pour que le temps de recherche l'emporte' db 'sur le temps de configuration supplémentaire requis.',0 SAMPLE_STRING_LENGTH equ $-SampleString ; prompt utilisateur. Prompt db 'Entrez le caractère à rechercher :$' ; Messages des états résultants. ByteFoundMsg db 0dh,0ah db 'octet spécifié trouvé.',0dh,0ah,'$' ZeroByteFoundMsg db 0dh,0ah db 'octet zéro trouvé.',0dh,0ah,'$' NoByteFoundMsg db 0dh,0ah db 'tampon analysé sans correspondance.',0dh,0a ;h,'$' ; Table des initiales, des points d'entrée de boucle partielle pour ; SearchMaxLength. SearchMaxLengthEntryTable label word dw SearchMaxLengthEntry4 dw SearchMaxLengthEntry1 dw SearchMaxLengthEntry2 dw SearchMaxLengthEntry3 .code Start proc near mov ax,@data ;pointe sur le segment de ;données standard mov ds,ax mov dx,offset Prompt mov ah,9 ;Fonction d'affichage de chaîne DOS int 21h ;prompt utilisateur mov ah,1 ;fonction lecture clavier de DOS int 21h ;du caractère à rechercher mov ah,al ;met le caractère à rechercher dans AH mov cx,SAMPLE_STRING_LENGTH ;nombre d'octets à ;rechercher mov si,offset SampleString ;pointe sur le tampon à ;rechercher call SearchMaxLength ;recherche dans le tampon mov dx,offset ByteFoundMsg ;suppose que nous avons ;trouvé l'octet jc PrintStatus ;nous avons trouvé l'octet ;nous n'avons pas trouvé l'octet, ;teste si nous avons trouvé l'octet ; zéro ou atteint la fin du tampon mov dx,offset NoByteFoundMsg ;suppose que nous n'avons pas trouvé l'octet zéro jcxz PrintStatus ;nous n'avons pas trouvé l'octet ;zéro mov dx,offset ZeroByteFoundMsg ;nous avons trouvé ;l'octet zéro PrintStatus: mov ah,9 ;Fonction d'affichage de chaîne DOS int 21h ;reporte l'état mov ah,4ch ;retourne à DOS int 21h Start endp ; Fonction de recherche dans un tampon de longueur spécifié ; La recherche est effectuée jusqu'à ce que soit trouvé un ; octet spécifié ou un octet zéro. ; ; Entrée: ; AH = caractère à rechercher ; CX = longueur maximale à rechercher (doit être > 0) ; DS:SI = pointeur sur le tampon à rechercher ; ; Sortie: ; CX = 0 si et seulement si nous n'avons pas trouvé l'octet ; recherché ou l'octet zéro ; DS:SI = pointeur sur l'octet recherché s'il est trouvé, ou bien sur l'octet ; après l'octet zéro s'il est trouvé, ou bien sur ; le dernier octet vérifié si ni l'octet recherché, ni l'octet zéro ne sont trouvés. ; SearchMaxLength proc near cld mov bx,cx add cx,3 ;calcule le nombre maximal de tours shr cx,1 ;de boucle, laquelle est shr cx,1 :déroulée quatre fois and bx,3 ;calcule l'index dans la table de ;point d'entrée ;pour la première boucle ;éventuellement partielle shl bx,1 ;prépare une table pré-calculée de ;taille mot jmp SearchMaxLengthEntryTable[bx] ;effectue le branchement sur le premier tour de boucle, SearchMaxLengthLoop: SearchMaxLengthEntry4: lodsb ;récupère le prochain octet cmp al,ah ;est-ce l'octet recherché? jz ByteFound ;oui, nous avons réussi and al,al ;est-ce l'octet terminal zéro ? jz ByteNotFound ;oui, nous avons échoué SearchMaxLengthEntry3: lodsb ;récupère le prochain octet cmp al,ah ;est-ce l'octet recherché? jz ByteFound ;oui, nous avons réussi and al,al ;est-ce l'octet terminal zéro? jz ByteNotFound ;oui, nous avons échoué SearchMaxLengthEntry2: lodsb ;récupère le prochain octet cmp al,ah ;est-ce l'octet recherché? jz ByteFound ;oui, nous avons réussi and al,al ;est-ce l'octet terminal zéro? jz ByteNotFound ;oui, nous avons échoué SearchMaxLengthEntry1: lodsb ;récupère le prochain octet cmp al,ah ;est-ce l'octet recherché? jz ByteFound ;oui, nous avons réussi and al,al ;est-ce l'octet terminal zéro? jz ByteNotFound ;oui, nous avons échoué loop SearchMaxLengthLoop ;si ce n'est ni l'un, ni ;l'autre, vérifions les quatre ;prochains octets, s'il en reste ByteNotFound: clc ;retourne l'état "non trouvé" ret ByteFound: dec si ;re-pointe sur l'emplacement de ;l'octet trouvé que nous recherchions stc ;retourne l'état "trouvé" ret SearchMaxLength endp end Start