home *** CD-ROM | disk | FTP | other *** search
- ;*********************************************************************
- ;* INSTRING.ASM dd 850619, Auteur P.J. Huizinga. *
- ;*********************************************************************
- ; routine zoekt naar source string in destination string
- ; let op: case sensitive; evt. eerst uppercase maken.
- ;
- ; input : DS:SI wijst naar 1e karakter source string
- ; ES:DI wijst naar 1e karakter destination string
- ; AX bevat lengte source string
- ; CX bevat lengte destination string
- ;
- ; output: AX bevat offset source string in destination string
- ; = 0 indien geen exact match gevonden
- ; overige registers ongewijzigd
- ;
- ; vb. : als DS:SI wijst naar 'MNO' en AX = 3
- ; en ES:DI wijst naar 'ABCDEFGHIJKLMNOP' en CX = 16,
- ; dan is na return AX = DI + 12
- ;
- INSTRING PROC NEAR
- PUSH SI ; red gebruikte registers
- PUSH DI
- PUSH DX
- PUSH CX
- PUSH BX
- PUSH AX
- MOV DX,DI ; offset 1e karakter destination
- MOV BX,SI ; idem source
- CMP AX,0 ; controleer lengtes:
- JG INSTRING_01 ; moeten positief zijn
- JMP INSTRING_05
- INSTRING_01: CMP CX,0
- JG INSTRING_02
- JMP INSTRING_05
- INSTRING_02: CMP AX,CX ; vergelijk lengtes:
- JNG INSTRING_03 ; source str mag niet langer zijn
- JMP INSTRING_05
- ;
- ; zoek naar 1e karakter van source in destination string
- ;
- INSTRING_03: MOV DI,DX
- MOV SI,BX
- MOV AL,[SI] ; AL := 1e karakter source string
- CLD ; zet direction flag voorwaarts
- REPNZ SCASB ; zoek tot match of tot CX=0
- JNZ INSTRING_05 ; geen match gevonden
- ;
- ; match van 1e karakter gevonden,
- ; controleer of rest ook matcht.
- ;
- MOV DX,DI ; onthou positie in dest. str.
- DEC DI ; DI op match-karakter dest. str.
- POP AX ; lengte source string van stack
- PUSH AX ; herstel stackpointer
- XCHG AX,CX ; lengte in CX en bewaar CX
- REPZ CMPSB ; vergelijk source met destination
- JZ INSTRING_04 ; ZF=0 -->> match gevonden
- ;
- ; mis. verder zoeken
- ;
- XCHG AX,CX ; herstel waar we waren
- JMP INSTRING_03 ; en verder zoeken
- ;
- ; raak. outputparm zetten en return
- ;
- INSTRING_04: MOV AX,DX ; offset in dest. str.
- DEC AX ; was al 1 opgehoogd
- JMP SHORT E_INSTRING ; klaar
- ;
- ; source string komt niet voor in destination string
- ; (of inputparms niet correct)
- ;
- INSTRING_05: MOV AX,0 ; geen match gevonden
- ;
- ; exit
- ;
- E_INSTRING: POP BX ; AX op stack, is outputparm
- POP BX ; herstel overige registers
- POP CX
- POP DX
- POP DI
- POP SI
- RET ; en return
- INSTRING ENDP