![]() |
Inline Assembler Parameter übergabe
Delphi-Quellcode:
a steht in [EAX]
procedure Prc(var a : Cardinal);
Delphi-Quellcode:
a steht in [EAX]
procedure Swap1(var a, b : Cardinal);
b steht in [EDX]
Delphi-Quellcode:
a steht in EAX
procedure Proc(a, b : Cardinal);
b steht in EDX Doch wie sieht es in diesen Fällen aus:
Delphi-Quellcode:
procedure Proc(a : Word);
Delphi-Quellcode:
procedure Proc(a, b, c : Integer);
Delphi-Quellcode:
Wie komme ich jetzt an die Parameter heran?
function Proc(a, b, c : Integer; d : Byte; var e : Byte; var f : Cardinal) : Word;
|
Re: Inline Assembler Parameter übergabe
Delphi-Quellcode:
Im letzten Beispiel entsteht eine Mischübergabe, aus Register und Stack.
procedure Prc(var a{[EAX]}: Cardinal);
procedure Swap1(var a{[EAX]},b{[EDX]}: Cardinal); procedure Proc(a{AX}: Word); procedure Proc(b{AX}: Word); procedure Proc(a{EAX}, b{EDX}, c{ECX} : Integer); function Proc(a{EAX}, b{EDX}, c{ECX} : Integer; d : Byte; var e : Byte; var f: Cardinal) : Word; {EAX} // D,E,F liegen auf dem Stack Die ersten 3 ordinalen Paramater werden in den Registern EAX,EDX,ECX übergeben. Die restlichen Paramter liegen auf dem Stack. Wobei var E,F Zeiger auf die Speicheradresse sind.
Delphi-Quellcode:
Man sieht also das ein cleverer Delphi Programmier versucht seine Proceduren mit maximal 3 ordinalen Paramtern zu versehen. Bei Methoden mit 2 ordinalen Paramtern da in EAX = Self steht. Durch dieses Vorgehen kann der Optimierer innerhalb der Procedure den Stackframe wegoptimieren. Dies spart Stack + Zeit.
function Proc(a{EAX}, b{EDX}, c{ECX} : Integer; d : Byte; var e : Byte; var f: Cardinal) : Word;
asm // compiler erzeugt Stackframe autom. // PUSH EBP // MOV EBP,ESP PUSH EBX // EBX sichern MOV EBX,[A] // == MOV EBX,[EAX] MOV EBX,[B] // == MOV EBX,[EDX] MOV EBX,[C] // == MOV EBX,[ECX] MOV BL,D // == MOV BL,[EBP + ?] MOV EBX,E // == MOV EBX,[EBP + ?] MOV BL,[EBX] // BL := E MOV EBX,F MOV EBX,[EBX] // EBX := F MOV AX,BX // Result := BX MOV @Result,BX // Result := BX POP EBX // Stackframe entfernen, autm. durch Compiler // POP EBP end; Sollte der Programmierer nicht ordinale Parameter benutzen wollen so wird er dann immer diesen Paramter in einen vergleichbaren ordinalen Typ konvertieren. Z.b. Zeiger auf Double, oder var Double; Gruß Hagen |
Re: Inline Assembler Parameter übergabe
Danke!
Jetzt lohnt es sich auch die schönen neuen Processor Befehle zu lernen! |
Re: Inline Assembler Parameter übergabe
:shock: Wow! Wo lernt man sowas?
|
Re: Inline Assembler Parameter übergabe
1. Assembler lernen
2. Delphi Hilfe lesen 3. Den Quellcode von Borland studieren. |
Re: Inline Assembler Parameter übergabe
Zitat:
Interessanterweise habe ich in meinem Leben nur ein Buch über Assembler gelesen, ziemlich alter Schinken und noch Z80=U880=8080. Gruß Hagen |
Re: Inline Assembler Parameter übergabe
Moin Hagen,
Zitat:
;-) |
Re: Inline Assembler Parameter übergabe
Zitat:
Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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