Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Inkrementieren von Eax geht nicht (https://www.delphipraxis.net/129210-inkrementieren-von-eax-geht-nicht.html)

brechi 15. Feb 2009 22:38

Re: Inkrementieren von Eax geht nicht
 
mr_g

kannst du mir dann ein bsp. geben wo ein

Delphi-Quellcode:
begin
asm
end;
end;
was anderes ist als ein

Delphi-Quellcode:
asm
end;
würde mich mal interessieren

Mr_G 15. Feb 2009 23:22

Re: Inkrementieren von Eax geht nicht
 
Wie gesagt... bei einer Funktion oder Prozedur:
Delphi-Quellcode:
function Foo(Bar:Integer): Boolean;
asm
end;
Das ist nicht gleich dem:
Delphi-Quellcode:
function Foo(Bar:Integer): Boolean;
begin
  asm
  end;
end;
Die OH sagt dazu:
Zitat:

Der Compiler führt für diese Routinen [erstere ^^] verschiedene Optimierungen durch:
  • Der Compiler erstellt keinen Code zum Kopieren von Wert-Parametern in lokale Variablen. Dies betrifft alle Wert-Parameter vom Typ String und alle anderen Wert-Parameter, deren Größe nicht ein, zwei oder vier Byte beträgt. Innerhalb der Routine müssen derartige Parameter als var-Parameter behandelt werden.
  • Der Compiler weist keine Funktionsergebnis-Variable zu, und eine Referenz auf das Symbol @Result ist ein Fehler. Eine Ausnahme bilden Funktionen, die eine Referenz auf einen String, eine Variante oder ein Interface zurückliefern. Die aufrufende Routine weist diesen Typen immer einen @Result-Zeiger zu.
  • Der Compiler generiert nur Stackframes für verschachtelte Routinen, für Routinen mit lokalen Parametern oder für Routinen, die über Parameter im Stack verfügen.
  • Locals ist die Größe der lokalen Variablen, Params die Größe der Parameter. Wenn sowohl Locals als auch Params Null ist, existiert kein Eintrittscode, und der Austrittscode besteht nur aus einer RET-Anweisung.
...
Gruß Mr_G

Cyf 15. Feb 2009 23:28

Re: Inkrementieren von Eax geht nicht
 
Zitat:

Zitat von Apollonius
Dumm ist allerdings, dass der Compiler selbst in einer reinen Assembler-Routine meint, einen Stackframe generieren zu müssen, was extrem lästig sein kann.

Ich lehn mich mal aus dem Fenster und behaupte, er machts nicht in wirklich jedem Fall (aber in fast jedem), ich meine mich zu erinnern, dass ich das mal durchprobiert hatte und bei bestimmten Kombinationen der Basepointer nicht gepusht wird.
Bloß der abschließende Rücksprung wird immer generiert.


Zitat:

Zitat von Dax
Wie sonst soll es vom Compiler verwaltete lokale Variablen geben? ;)

Wer braucht die schon. :wink: Wenn ich schon eine asm-Routine einbau, dann verwalte ich auch meine Variablen und den Frame selbst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz