Hallo,
Gelegentlich sehe ich mir die mit der CE mitgelieferten Sources an, teils aus Interesse, wie das eine oder andere Problem von Profis gelöst wird, aber natürlich auch, um Anregungen für eigene Entwicklungen zu finden. Dabei interessieren mich auch und gerade die Assembler-Implementierungen. Zu Turbopascal - Zeiten habe ich relativ vieles mit dem integrierten Assembler realisiert, was durchweg zu beachtlichen Performance-Steigerungen führte. Dabei war ich meilenweit entfernt davon, ein Assembler-'Crack' zu sein, was sich spätestens bei den ersten Versuchen mit Delphi 4 zeigte, als ich feststellen musste, daß in Delphi (Pascal) implementierte Routinen schneller waren als meine mühsam zusammengefrickelten und durchaus flotten Assembler - Sachen mit der gleichen Funktion
Seitdem habe ich eigentlich nichts mehr mit Assembler realisiert. Dennoch schaue ich immer mal wieder in die Sources und versuche, den Ablauf zu verstehen, was mir zugegebenermaßen eher selten gelingt. Dabei stieß ich auf folgenden Code, der zu der Implementierung der 'Pos' - Funktion in der
Unit 'System' gehört:
Delphi-Quellcode:
function Pos(
const SubStr, Str: UnicodeString; Offset: Integer): Integer;
overload;
{$IFDEF PUREPASCAL}
var
I, LIterCnt, L, J: Integer;
PSubStr, PS: PChar;
LCh: Char;
begin
// [Delphi - Pascal Implementierung
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
asm
test eax, eax
jz @
Nil
test edx, edx
jz @
Nil
dec ecx
jl @
Nil
[ ... ]
// jede Menge Assembler-Code
add esp, 12
mov ecx, [esp]
or ecx, [esp+4]
jz @NoClear
mov ebx, eax
// was soll das Hin- und Herkopieren der Register?
mov esi, edx
// ??
mov eax, ebx
// ??
mov edx, esi
// ??
@NoClear:
add eax, edx
shr eax, 1
// divide by 2 to make an index
pop ebx
pop esi
end;
{$ENDIF CPUX86}
{$ENDIF !PUREPASCAL}
Wozu sind die scheinbar überflüssigen Kopieraktionen gut, zumal ja EBX und ESI anschließend aus dem Stack restauriert weden?
Kann mich einer der hier versammelten Experten mal aufklären, was es damit auf sich hat?
Gruß LP