Einzelnen Beitrag anzeigen

Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
157 Beiträge
 
Delphi 12 Athens
 
#1

Assembler-Rätsel

  Alt 29. Feb 2020, 13:41
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

Geändert von Maekkelrajter (29. Feb 2020 um 13:46 Uhr)
  Mit Zitat antworten Zitat