Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- procedure _Pos{ substr : ShortString; s : ShortString ) : Integer};
- asm
- { ->EAX Pointer to substr }
- { EDX Pointer to string }
- { <-EAX Position of substr in s or 0 }
- PUSH EBX
- PUSH ESI
- PUSH EDI
- MOV ESI,EAX { Point ESI to substr }
- MOV EDI,EDX { Point EDI to s }
- XOR ECX,ECX { ECX = Length(s) }
- MOV CL,[EDI]
- INC EDI { Point EDI to first char of s }
- PUSH EDI { remember s position to calculate index }
- XOR EDX,EDX { EDX = Length(substr) }
- MOV DL,[ESI]
- INC ESI { Point ESI to first char of substr }
- DEC EDX { EDX = Length(substr) - 1 }
- JS @@fail { < 0 ? return 0 }
- MOV AL,[ESI] { AL = first char of substr }
- INC ESI { Point ESI to 2'nd char of substr }
- SUB ECX,EDX { #positions in s to look at }
- { = Length(s) - Length(substr) + 1 }
- JLE @@fail
- @@loop:
- REPNE SCASB
- JNE @@fail
- MOV EBX,ECX { save outer loop counter }
- PUSH ESI { save outer loop substr pointer }
- PUSH EDI { save outer loop s pointer }
- MOV ECX,EDX
- REPE CMPSB
- POP EDI { restore outer loop s pointer }
- POP ESI { restore outer loop substr pointer }
- JE @@found
- MOV ECX,EBX { restore outer loop counter }
- JMP @@loop
- @@fail:
- POP EDX { get rid of saved s pointer }
- XOR EAX,EAX
- JMP @@exit
- @@found:
- POP EDX { restore pointer to first char of s }
- MOV EAX,EDI { EDI points of char after match }
- SUB EAX,EDX { the difference is the correct index }
- @@exit:
- POP EDI
- POP ESI
- POP EBX
- end;
Add Comment
Please, Sign In to add comment