home *** CD-ROM | disk | FTP | other *** search
- ; INDEX- computes the offset of one string within another.
- ;
- ; On entry:
- ;
- ; ES:DI- Points at the test string that INDEX will search for
- ; in the source string.
- ; DS:SI- Points at the source string which (presumably)
- ; contains the string INDEX is searching for.
- ;
- ; On exit:
- ;
- ; AX- Contains the offset into the source string where the
- ; test string was found.
-
- INDEX proc near
- push si
- push di
- push bx
- push cx
- pushf ;Save direction flag value.
- cld
-
- mov al, es:[di] ;Get the length of the test string.
- cmp al, [si] ;See if it is longer than the length
- ja NotThere ; of the source string.
-
- ; Compute the index of the last character we need to compare the
- ; test string against in the source string.
-
- mov al, es:[di] ;Length of test string.
- mov cl, al ;Save for later.
- mov ch, 0
- sub al, [si] ;Length of source string.
- mov bl, al ;# of times to repeat loop.
- inc di ;Skip over length byte.
- xor ax, ax ;Init index to zero.
- CmpLoop: inc ax ;Bump index by one.
- inc si ;Move on to the next char in source.
- push si ;Save string pointers and the
- push di ; length of the test string.
- push cx
- rep cmpsb ;Compare the strings.
- pop cx ;Restore string pointers
- pop di ; and length.
- pop si
- je Foundindex ;If we found the substring.
- dec bl
- jnz CmpLoop ;Try next entry in source string.
-
- ; If we fall down here, the test string doesnâ•’t appear inside the
- ; source string.
-
- NotThere: xor ax, ax ;Return INDEX = 0
-
- ; If the substring was found in the loop above, remove the
- ; garbage left on the stack
-
- FoundIndex: popf
- pop cx
- pop bx
- pop di
- pop si
- ret
- INDEX endp
-