Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

mr_emre_d 14. Feb 2009 19:20

Re: Inkrementieren von Eax geht nicht
 
Zitat:

Zitat von Hawkeye219
Warum möchtest du eigentlich eine Assembler-Routine schreiben?

Einfach - weil ich mich gerade in Assembler einarbeite :P

EDIT: Ok, ich hab mir das nochmal angeschaut und habe gemerkt, dass es nun
gar nicht geht :S Ich bin nun total verwirrt
Wenn ich mit stdcall kompiliere, liefert GetFileAttributes immer -1 zurück
ansonten funktioniert das prima

Apollonius 14. Feb 2009 20:26

Re: Inkrementieren von Eax geht nicht
 
Um das mal deutlicher zu sagen: Wenn eine Stdcall-Routine aufgerufen wird, kann im Eax-Register irgendetwas stehen. Nur bei der Aufrufkonvention Register enthält es den ersten Parameter.

Mr_G 14. Feb 2009 22:34

Re: Inkrementieren von Eax geht nicht
 
Zitat:

Zitat von Apollonius
... Nur bei der Aufrufkonvention Register enthält es den ersten Parameter.

Afaik kann man die sogar weglassen wenn man bei der Funktion (so wie mr_emre_d es ja gemacht hat) statt "begin" und "end" direkt "asm" und "end" schreibt.

himitsu 14. Feb 2009 23:20

Re: Inkrementieren von Eax geht nicht
 
Bei StdCall liegen die Parameter aber auf'm Stack und nicht in den Registern!
Und das Result auf EAX.

Laß dat StdCall weg, dann sollte es gehn, oder du nutzt den Stack.

Delphi-Quellcode:
function _FileExists( Filename: PChar ): LongBool; stdcall;
asm
  push [esp+8]
  call GetFileAttributes
  inc eax
end;

function _FileExists( Filename: PChar ): LongBool;
asm
  push eax
  call GetFileAttributes
  inc eax
end;
Zitat:

Zitat von mr_emre_d
Der Wert von Eax ändert sich nach dem Call

ja klar, denn GetFileAttributes gibt ja dennoch ein ergebnis zurück

Zitat:

Zitat von mr_emre_d
Wenn die Datei nicht existiert, wird Cardinal(-1) zurückgegeben
und ich inkrementiere diesen Wert um eben False(0) zu erhalten
(ansonsten wäre der Wert>0 und somit True)

Du weißt aber, das GetFileAttributes einen Integer liefert?
Und du mindestens die unteren 16 Byte auswerten mußt ... also statt Boolean/ByteBool muß schon mindestens WordBool verwendet werden!

mr_emre_d 15. Feb 2009 00:14

Re: Inkrementieren von Eax geht nicht
 
Zitat:

Zitat von himitsu
Bei StdCall liegen die Parameter aber auf'm Stack und nicht in den Registern!
Und das Result auf EAX.

Achja ? Wusste ich gar nicht ... Das ganze wird überall sehr ungenau beschrieben.

Zitat:

Zitat von himitsu
Zitat:

Zitat von mr_emre_d
Der Wert von Eax ändert sich nach dem Call

ja klar, denn GetFileAttributes gibt ja dennoch ein ergebnis zurück

[/quote]
Das war mir bewusst :) Das war halt nur die Antwort auf den vorherigen Beitrag.

MfG

himitsu 15. Feb 2009 09:43

Re: Inkrementieren von Eax geht nicht
 
also in meiner OH steh es eigentlich recht genau ^^

Code:
[i]OH: Aufrufkonventionen[/i]
                                                  Parameterübergabe
Direktive  Parameterreihenfolge   Bereinigung  in Registern?

register   Von links nach rechts  Routine      Ja
pascal     Von links nach rechts  Routine      Nein
cdecl      Von rechts nach links  Aufrufer     Nein
[b]stdcall[/b]    Von rechts nach links  Routine      [b]Nein[/b]
safecall   Von rechts nach links  Routine      Nein

brechi 15. Feb 2009 13:46

Re: Inkrementieren von Eax geht nicht
 
wie wärs mit:

Delphi-Quellcode:
push FileName
call GetFileAttributes
inc eax
dann ist es egal obs stdcall oder register ist.

Und wenn ich mich nicht irre, kann man auch beliebig viele Begin und Ends um den asm Block schreiben. Der Compiler sollte das gleiche draus machen, als wenn sie nicht da wären.

Mr_G 15. Feb 2009 14:50

Re: Inkrementieren von Eax geht nicht
 
Zitat:

Zitat von brechi
Und wenn ich mich nicht irre, kann man auch beliebig viele Begin und Ends um den asm Block schreiben. Der Compiler sollte das gleiche draus machen, als wenn sie nicht da wären.

Das trifft nicht ganz zu: Wenn man seine Funktion oder Prozedur mit asm beginnt führt der Compiler andere Optimierungen aus und behandelt das Ganze etwas anders. Siehe dazu die OH und hier (unter 3.2)...

Apollonius 15. Feb 2009 14:54

Re: Inkrementieren von Eax geht nicht
 
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.

Dax 15. Feb 2009 15:07

Re: Inkrementieren von Eax geht nicht
 
Wie sonst soll es vom Compiler verwaltete lokale Variablen geben? ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 Uhr.
Seite 2 von 3     12 3      

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