Einzelnen Beitrag anzeigen

Maekkelrajter

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

AW: Assembler-Rätsel

  Alt 29. Feb 2020, 18:08
Ähnlich schräg ist der folgende Teil (Delphi 10.1 immer noch function Pos):

Code:
@Exit:
       add  esp, 12
// es folgt überflüssiger Code
@Past:
       mov  eax, [esp]
       or   eax, [esp+4]
       jz   @PastNoClear // Preisfrage: wo landen wir wenn das Z-Flag nicht gesetzt ist?
@PastNoClear:
// ab hier wird es wieder sinnig
       pop  ebx
       pop  esi
@Nil:
       xor  eax, eax
       ret
Danke für deine erhellenden Ausführungen.
Über die 'Preisfrage' hatte ich allerdings auch schon gegrübelt
Vielleicht, so argwöhnte ich, steckt ja hinter dem Ganzen höchst raffinierte Compiler- bzw. Assembler-Magie, von der ich keine Ahnung habe?!

Ich bastele nämlich gerade selbst an einer 'Pos'-Funktion, die einen weiteren Parameter entgegennimmt, etwa folgendermaßen
Delphi-Quellcode:
function Pos(const SubStr, Str: UnicodeString; Offset, limit: Integer): Integer;
asm
  // wenn limit <= offset dann Ende mit result = 0
  // wenn limit > length(Str) dann limit = length(Str)
  // nach substr zwischen offset und limit suchen...
end;
Damit sollen Teilbereiche von großen Strings durchsucht werden. Mit Copy(Str, offset, limit - offset) einen Teilstring zu erzeugen und dann zu durchsuchen, funktioniert natürlich, ist aber bezüglich der Performance indiskutabel.
Ich habe deshalb nun den Ehrgeiz, sowas doch nochmal in Assembler hinzukriegen
Schau'n wir mal!

Gruß LP
  Mit Zitat antworten Zitat