Ä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