Einzelnen Beitrag anzeigen

Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
118 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Assembler-Rätsel

  Alt 8. Apr 2020, 15:36
@Maekkelrajter: Du solltest den Fall limit<0 noch abfangen.
Darauf hatte ich verzichtet, da weiter unten im Code der Vergleich des Substr mit dem zu durchsuchenden Teilstring durchgeführt wird:

Delphi-Quellcode:
      
       mov ebx, [eax-4] //Length(Substr)
       sub esi, ecx //effective length of Str (= length(str) - offset)
       add edx, ecx //addr of the first AnsiChar at starting position
       cmp esi, ebx
       jl @Past //jump if EffectiveLength(Str)<Length(Substr)
       
       [...]
@Past:
       pop ebx
       pop esi
@Nil:
       xor eax, eax
       jmp @done
Falls 'EffectiveLength(Str) < Length(Substr)', was bei negativem 'Limit' der Fall wäre, erfolgt der Ausstieg mit Result =0.
Die von dir vorgeschlagene Variante hätte zur Folge, dass auch bei allen Limit-Werten < 0 der limit-Wert einfach ignoriert wird und die Suche dennoch durchgeführt wird.
Deshalb habe ich das ganze Design noch einmal überarbeitet. Die Vorbelegung der Parameter wurde entfernt, ebenso die Null-Prüfung von 'Limit'. Alle Limit-Werte, die kleiner oder gleich Offset sind führen jetzt zu einem Ende mit Result = 0, ebenso wenn Offset kleiner 1 ist.
Für den geplanten speziellen Einsatz dieser Funktion ist das so völlig ausreichend:
Delphi-Quellcode:
      

function PosInLimits(const SubStr, Str: RawByteString; Offset,Limit:Integer): Integer;
asm
       test eax, eax
       jz @Nil
       test edx, edx
       jz @Nil
       dec ecx
       jl @Nil

       push esi
       push ebx

       mov esi, [edx-4] //Length(Str)

       mov ebx, limit // limit holen
       cmp ebx, esi // limit >= Length(Str)?
       jge @IgnoreLimit // limit ignorieren
       mov esi, ebx // limit übernehmen anstelle von Length(Str)
@IgnoreLimit:

       mov ebx, [eax-4] //Length(Substr)
       sub esi, ecx //effective length of Str (= length(str) - offset)
       add edx, ecx //addr of the first AnsiChar at starting position
       cmp esi, ebx
       jl @Past //jump if EffectiveLength(Str)<Length(Substr)

       [usw.]
Trotzdem Danke für den Hinweis!

Gruß LP
  Mit Zitat antworten Zitat