Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.064 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Bitte Assembler-Routine verbessern

  Alt 24. Dez 2007, 10:54
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.
Angehängte Dateien
Dateityp: pas test_02_203.pas (28,5 KB, 55x aufgerufen)
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat