pos findet imme rnur das erste Vorkommen. Hier noch eine Funktion, die jedes beliebige Vorkommen findet. Man muss nur immer die Position des letzten Vorkommen angeben.
Delphi-Quellcode:
function NextPos(SubStr: AnsiString; Str: AnsiString; LastPos: DWORD
= 0): DWORD;
type
StrRec =
packed record
allocSiz: Longint;
refCnt: Longint;
length: Longint;
end;
const
skew = sizeof(StrRec);
asm
// Search-String passed?
TEST EAX,EAX
JE @@noWork
// Sub-String passed?
TEST EDX,EDX
JE @@stringEmpty
// Save registers affected
PUSH ECX
PUSH EBX
PUSH ESI
PUSH EDI
// Load Sub-String pointer
MOV ESI,EAX
// Load Search-String pointer
MOV EDI,EDX
// Save Last Position in EBX
MOV EBX,ECX
// Get Search-String Length
MOV ECX,[EDI-skew].StrRec.length
// subtract Start Position
SUB ECX,EBX
// Save Start Position of Search String to return
PUSH EDI
// Adjust Start Position of Search String
ADD EDI,EBX
// Get Sub-String Length
MOV EDX,[ESI-skew].StrRec.length
// Adjust
DEC EDX
// Failed if Sub-String Length was zero
JS @@fail
// Pull first character of Sub-String for SCASB function
MOV AL,[ESI]
// Point to second character for CMPSB function
INC ESI
// Load character count to be scanned
SUB ECX,EDX
// Failed if Sub-String was equal or longer than Search-String
JLE @@fail
@@loop:
// Scan for first matching character
REPNE SCASB
// Failed, if none are matching
JNE @@fail
// Save counter
MOV EBX,ECX
PUSH ESI
PUSH EDI
// load Sub-String length
MOV ECX,EDX
// compare all bytes until one is not equal
REPE CMPSB
// restore counter
POP EDI
POP ESI
// all byte were equal, search is completed
JE @@found
// restore counter
MOV ECX,EBX
// continue search
JMP @@loop
@@fail:
// saved pointer is not needed
POP EDX
XOR EAX,EAX
JMP @@exit
@@stringEmpty:
// return zero - no match
XOR EAX,EAX
JMP @@noWork
@@found:
// restore pointer to start position of Search-String
POP EDX
// load position of match
MOV EAX,EDI
// difference between position and start in memory is
// position of Sub
SUB EAX,EDX
@@exit:
// restore registers
POP EDI
POP ESI
POP EBX
POP ECX
@@noWork:
end;
Ist, glaube ich, von unserer Katze
, die jetzt gerade Trill frißt.