Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Unterschiedliche Ergebnisse TList.Sort 32bit / 64bit CompareItems

  Alt 17. Mai 2023, 00:04
Methoden und diese Inline, sowie die Generischen haben einen "unsichtbaren" ersten Self-Parameter.

Somit stimmt die Signatur dann nicht, im Vergleich mit einer "reinen" Prozedur.
Bei Methoden und Klassenmethoden kann man das mit Static beheben, aber für Untermethoden leider nicht.
Ja, sie haben einen unsichtbaren ersten Parameter (unter 32bit nur wenn etwas aus dem äußere Scope referenziert wird, unter 64bit immer).
Dieser hat aber nix mit dem Self-Parameter wie bei Methoden (entweder Referenz zur Instanz oder zu Klasse) zu tun, sondern hier wird die Addresse zum umgebenden Stackframe übergeben.
Darüber wird der Zugriff auf die Variablen außerhalb der Routine realisiert.

Wie David auf die von mir verlinkten Stackoverflow richtig erklärt, gibt es diesen unter Win64 immer, egal ob man auf den umgebenden Scope zugreift oder nicht.
Unter Win32 gibt es diesen nur wenn man auf den umgebenden Scope zugreift - deshalb funktioniert es dort.

Unter Win64 werden die ersten vier Parameter in den Registern rcx, rdx, r8 und r9 übergeben. Also sollten Item1 und Item2 in rcx und rdx sein, da wirds auch durch den Aufruf aus Sort heraus übergeben.
Dadurch, dass die Implementierung aber nested ist, nimmt der Compiler aber an, dass diese in rdx und r8 sind, denn in rcx erwartet er den Stackzeiger, wenn die Routine lokal aufgerufen wird.

Das kann man sehr einfach auch überprüfen, wenn man einfach mal in das FormCreate CompareItems(nil, nil); reinschreibt, dort einen Stoppunkt setzt und sich das Disassembly anschaut:

Delphi-Quellcode:
mov rcx,rbp
xor edx,edx
xor r8,r8
call CompareItems
Wie man sieht, wird rbp (Frame pointer) in rcx übergeben, wie ich zuvor beschrieben habe. Verschiebe ich CompareItems nach außerhalb schauts so aus:

Delphi-Quellcode:
xor ecx,ecx
xor edx,edx
call CompareItems
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (17. Mai 2023 um 00:11 Uhr)
  Mit Zitat antworten Zitat