Zitat von
Dax:
Delphi-Quellcode:
function CharPos_JOH_SSE2_1_b(Ch : Char;
const Str : AnsiString; aStart : Integer = 1) : Integer;
asm
test edx, edx
jz @@NullString
mov esi, ecx
dec esi
mov ecx, [edx-4]
cmp esi, ecx
jle @@Continue
xor eax, eax
ret
@@Continue:
add ecx, esi
add edx, esi
push ebx
mov ebx, eax
cmp ecx, 16
jl @@Small
...
...
end;
Ich hab kein Delphi, um es zu testen.. Aber ich vermute, dass es so läuft. Was ich hier tue, entspricht weitgehend deiner Vermutung: am Anfang sagen wir einfach, dass der String aStart Zeichen kürzer ist als tatsächlich und setzen den Anfang des Strings (für die Funktion) auf das Zeichen bei aStart.
@Dax:
Dann sollte es hinter @@Continue heißen
sub ecx,esi
Oder hab ich da was falsch verstanden?
Und mehr grundsätzlicher Natur :
ESI sollte nicht verändert werden (oder vorher gepushed und vor dem RET wieder gepopt werden).
@Alzaimar:
Ich habe meine PosEx - Funktion inzwischen erweitert, sie kann jetzt vorwärts und rückwärts suchen, in beiden Fällen mit beliebigem AStart. Und : Wenn nur ein Zeichen gesucht wird, dann werden (sowohl für Vorwärtssuche wie auch Rückwärtssuche) Routinen benutzt, die auf dem Code von John O'Harrow basieren.