AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Assembler Parameter auf Stack legen
Thema durchsuchen
Ansicht
Themen-Optionen

Assembler Parameter auf Stack legen

Ein Thema von mwilms · begonnen am 24. Nov 2022 · letzter Beitrag vom 29. Nov 2022
 
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#3

AW: Assembler Parameter auf Stack legen

  Alt 24. Nov 2022, 21:40
Du versucht hier 32-Bit ASM in x64 zu schreiben.

Du solltest dir erstmal die x64 calling convention anschauen, google. Ich erkläre dir mal eben die Basics:

Für nicht float Werte:
Arg1: Rcx, Arg2: Rdx, Arg3: R8, Arg4: R9 und alle weiteren Argumente werden auf dem Stack abgelegt (gleich mehr dazu).

Für float Werte:
Arg1: xmm0, Arg2: xmm1, Arg3: xmm2, Arg4: xmm3 und dann wieder Stack..

In x64 musst du Platz auf dem Stack machen bevor due eine Funktion callst, nennt sich Shadowspace oder scratchspace. Da die ersten vier Parameter via register passed werden, musst du 8*4 also 32 oder 0x20 bytes auf dem Stack reservieren, das heißt Argument 5 fängt dann effektiv bei Rsp-0x28 an. Außerdem musst du den Stackpointer RSP 16byte alignen, weil sonst sowas wie movabs rax, [rsp+x] crashen würde, da das "a" in movaps für aligned steht (gibt auch movups).

Für deinen Code würde das nun bedeuten:

Delphi-Quellcode:
procedure GetParm(Par1: Int64; Par2: Int64); stdcall;
asm
  nop
end;

procedure SendPar; stdcall;
asm
  mov rcx, 1
  mov rdx, 2
  call GetParm
end;
Da du hier keine "naked" funktion erstellst, wird der compiler automatisch rsp reservieren und shadowspace erstellen. Du könntest es auch manuell machen:
Delphi-Quellcode:
procedure GetParm(Par1: Int64; Par2: Int64); stdcall;
asm
  nop
end;

procedure SendPar; stdcall;
asm
  .NOFRAME
  push rbp // nicht volatiles register rbp auf stack speichern
  mov rbp, rsp
  sub rsp, 0x28 // shadowspace + 8 byte für alignment
  and rsp, not 8 // stack 16 byte alignen
  mov rcx, 1
  mov rdx, 2
  call GetParm
  mov rsp, rbp
  pop rbp
  ret
end;

grüße

Geändert von Lyan (25. Nov 2022 um 01:08 Uhr)
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz