home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
progm
/
tptools.zip
/
ALLINST.ZIP
/
SEARCH.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-12-21
|
3KB
|
83 lines
; SEARCH.ASM
; Editor Toolbox 4.0
; Copyright (c) 1985, 87 by Borland International, Inc.
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE
PUBLIC Search
;****************************************************** Search
;function Search(var Buffer; BufLength : Word; St : String) : Word;
;Search through Buffer for St. BufLength is length of range to search.
;Returns number of bytes searched to find St, 0 if not found
;equates for parameters:
SearchSt EQU DWORD PTR [BP+6]
BufLength EQU WORD PTR [BP+10]
Buffer EQU DWORD PTR [BP+12]
Search PROC FAR
PUSH BP ;Save BP
MOV BP,SP ;Set up stack frame
PUSH DS ;Save DS
CLD ;Go forward
LES DI,Buffer ;ES:DI => Buffer
MOV BX,DI ;BX = Ofs(Buffer)
MOV CX,BufLength ;CX = Length of range to scan
LDS SI,SearchSt ;DS:SI => SearchSt[0]
MOV DL,[SI] ;DL = Length(St)
INC SI ;DS:SI => SearchSt[1]
LODSB ;AL = St[1]; DS:SI => SearchSt[2]
TEST DL,DL ;Length(St) = 0?
JZ Error ;If so, we're done
XOR DH,DH ;Clear DH
DEC DL ;DX = Length(St)-1
SUB CX,DX ;CX = BufLength - (Length(St)-1)
JBE Error ;Error if BufLength is less
Next: ;Search for first character in St
REPNE SCASB ;Search forward for St[1]
JNE Error ;Done if not found
TEST DX,DX ;If Length = 1 (DX = 0) ...
JZ Found ; the "string" was found
;Search for remainder of St
PUSH CX ;Save CX
PUSH DI ;Save DI
PUSH SI ;Save SI
MOV CX,DX ;CX = Length(St) - 1
REPE CMPSB ;Does rest of string match?
POP SI ;Restore SI
POP DI ;Restore DI
POP CX ;Restore CX
JNE Next ;Try again if no match
Found: ;Calculate number of bytes searched and return in St
DEC DI ;DX = Offset where found
MOV AX,DI ;AX = Offset where found
SUB AX,BX ;Subtract starting offset
JMP Done ;Done
Error:
XOR AX,AX ;Return 0
Done:
POP DS ;Restore DS
MOV SP,BP ;Restore SP
POP BP ;Restore BP
RET 10 ;Remove parameters and return
Search ENDP
CODE ENDS
END