; *** Listing 7.1 *** ; ; Programme pour illustrer la recherche dans un tampon d'une longueur spécifiée ; jusqu'à ce qu'un octet spécifié ou un octet zéro soit trouvé. ; Une boucle standard terminée par LOOP est utilisée. .model small .stack 100h .data ; chaîne test dans laquelle est effectuée la recherche. SampleString label byte db 'cette chaîne test est de longueur suffisante pour que' db 'le temps de recherche puis se l'emporter' db 'sur le temps de configuration supplémentaire requis.' SAMPLE_STRING_LENGTH equ $-SampleString ; User prompt. Prompt db 'Entrez le caractère à rechercher:$' ; Result status messages. 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 trouver de correspondance',0dh,0ah,'$' .code Start proc near mov ax,@data ;pointe sur segment de données standard mov ds,ax mov dx,offset Prompt mov ah,9 ;fonction d'affichage DOS int 21h mov ah,1 ;fonction DOS de lecture clavier 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 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, vérifions ;si nous trouvons l'octet zéro ou si nous atteignons ;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 octet zéro trouvé ; 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 testé si ni l'octet recherché, ni l'octet zéro ne sont trouvés. ; SearchMaxLength proc near cld SearchMaxLengthLoop: lodsb ;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 le prochain ;octet, s'il en reste ByteNotFound: clc ;retourne l'état "non trouvé" ret ByteFound: dec si stc ;retourne l'état "trouvé" ret SearchMaxLength endp end Start