home *** CD-ROM | disk | FTP | other *** search
- ;
- ; *** Listing 11-26 ***
- ;
- ; Determines whether two zero-terminated strings differ
- ; ignoring case-only differences, and if so where, using
- ; LODS.
- ;
- jmp Skip
- ;
- TestString1 label byte
- db 'THIS IS A TEST STRING THAT IS '
- db 'Z'
- db 'TERMINATED WITH A ZERO BYTE...',0
- TestString2 label byte
- db 'This is a test string that is '
- db 'a'
- db 'terminated with a zero byte...',0
- ;
- ; Macro to convert the specified register to uppercase if
- ; it is lowercase.
- ;
- TO_UPPER macro REGISTER
- local NotLower
- cmp REGISTER,ch ;below 'a'?
- jb NotLower ;yes, not lowercase
- cmp REGISTER,cl ;above 'z'?
- ja NotLower ;yes, not lowercase
- and REGISTER,bl ;lowercase-convert to uppercase
- NotLower:
- endm
- ;
- ; Compares two zero-terminated strings, ignoring differences
- ; that are only uppercase/lowercase differences.
- ;
- ; Input:
- ; DS:SI = first zero-terminated string
- ; ES:DI = second zero-terminated string
- ;
- ; Output:
- ; DS:SI = pointer to first case-insensitive differing
- ; location in first string, or 0 if the byte
- ; wasn't found
- ; ES:DI = pointer to first case-insensitive differing
- ; location in second string, or 0 if the byte
- ; wasn't found
- ;
- ; Registers altered: AX, BL, CX, DX, SI, DI
- ;
- ; Direction flag cleared
- ;
- ; Note: Does not handle strings that are longer than 64K
- ; bytes or cross segment boundaries.
- ;
- CompareStringsNoCase:
- cld
- mov cx,'az' ;for fast register-register
- ; comparison in the loop
- mov bl,not 20h ;for fast conversion to
- ; uppercase in the loop
- CompareStringsLoop:
- lodsw ;get the next 2 bytes
- mov dx,es:[di] ; from each string
- inc di ;point to the next word in the
- inc di ; second string
- TO_UPPER al ;convert the first byte from each
- TO_UPPER dl ; string to uppercase
- cmp al,dl ;do the first bytes match?
- jnz CompareStringsDifferent1 ;the strings differ
- and al,al ;is the first byte the terminating
- ; zero?
- jz CompareStringsSame
- ;yes, we're done with a match
- TO_UPPER ah ;convert the second byte from each
- TO_UPPER dh ; string to uppercase
- cmp ah,dh ;do the second bytes match?
- jnz CompareStringsDifferent ;the strings differ
- and ah,ah ;is the second byte the terminating
- ; zero?
- jnz CompareStringsLoop
- ;no, do the next 2 bytes
- CompareStringsSame:
- sub si,si ;return 0 pointers indicating that
- mov di,si ; the strings are identical
- ret
- CompareStringsDifferent1:
- dec si ;point back to the second byte of
- dec di ; the word we just compared
- CompareStringsDifferent:
- dec si ;point back to the first byte of the
- dec di ; word we just compared
- ret
- ;
- Skip:
- call ZTimerOn
- mov si,offset TestString1 ;point to one string
- mov di,seg TestString2
- mov es,di
- mov di,offset TestString2 ;point to other string
- call CompareStringsNoCase ;and compare the
- ; strings without
- ; regard for case
- call ZTimerOff