Einzelnen Beitrag anzeigen

markus888

Registriert seit: 23. Dez 2018
46 Beiträge
 
#9

AW: Assembler Parameter auf Stack legen

  Alt 25. Nov 2022, 20:46
In x64 musst du Platz auf dem Stack machen bevor due eine Funktion callst
Ich verstehe nicht, warum der Delphi Compiler das nicht macht.

Wenn ich eine Funktion/Prozedur aufrufe, dann reserviert immer die aufgerufene Funktion/Prozedur den Speicher.
Dem Aufrufer ist theoretisch ja auch nur der benötigte Stapelspeicher für die übergebenen Variablen bekannt.
Sprich der Vorgang wäre doppelt erforderlich, da der aufgerufene Code ja auch noch den Speicher für die internen Variablen reservieren müsste.

Wo siehst du den Vorteil, wenn der Aufrufer den Platz für die übergebenen Variablen reserviert?

Hier ein stupider Code:

Code:
function work_2(i,e:byte):Boolean;
var x:Integer;
begin
  x:=e+i;
  work_2:= x>0;
end;
function work_1(t, y :double;i,e,z,k:byte):boolean;stdcall;
var
  v:array[0..100] of Byte;
begin
 v[0]:= i;
 v[i]:= e;
 work_1:= (t<y) and work_2(i,e);
end;

begin
  var x:double;
  try
  work_1(3.5, 134.1, 20,30,10,40);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
Zitat von Stapelspeicher Reservierung bei Beginn von work_1:
X64Fpu.dpr.25: begin
push rbp
sub rsp,$0000000000000090
mov rbp,rsp

Zitat von Funktion Rückgabe ins Register schreiben und Speicher freigeben bei end von work_1:
X64Fpu.dpr.29: end;
movzx rax,byte ptr [rbp+$0000008f]
lea rsp,[rbp+$00000090]
pop rbp
Der Aufrufer reserviert nichts, das macht nur der Empfänger - warum hält sich Delphi hier nicht an die Vorgaben?
Weil was ist bei einer dll - da habe ich ja keinen Einfluss auf den Aufrufer - oder verhält sich der Compiler dann Normkonform?
Bei 32 Bit mit inline asm musste man sich damit ja nicht beschäftigen.
Da ich aber mit x64 noch keine asm Erfahrung habe, wäre es interessant hier eine universelle Lösung zu haben.

Edit: Hab jetzt etwas genauer hingesehen, und merke grade dass ich das Wesentliche mangels Erfordernis noch nicht ganz verstanden habe.
Der Stack-Base Pointer wird ja durch den call gesetzt. Muss mich da noch etwas vertiefen.

Geändert von markus888 (26. Nov 2022 um 00:23 Uhr)
  Mit Zitat antworten Zitat