AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Inkrementieren von Eax geht nicht

Ein Thema von mr_emre_d · begonnen am 14. Feb 2009 · letzter Beitrag vom 15. Feb 2009
Antwort Antwort
Seite 2 von 3     12 3      
mr_emre_d
(Gast)

n/a Beiträge
 
#11

Re: Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 20:20
Zitat von Hawkeye219:
Warum möchtest du eigentlich eine Assembler-Routine schreiben?
Einfach - weil ich mich gerade in Assembler einarbeite

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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 21:26
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 23:34
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.
Jan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

Re: Inkrementieren von Eax geht nicht

  Alt 15. Feb 2009, 00:20
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 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 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!
$2B or not $2B
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#15

Re: Inkrementieren von Eax geht nicht

  Alt 15. Feb 2009, 01:14
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 von himitsu:
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#16

Re: Inkrementieren von Eax geht nicht

  Alt 15. Feb 2009, 10:43
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
$2B or not $2B
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#17

Re: Inkrementieren von Eax geht nicht

  Alt 15. Feb 2009, 14:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#18

Re: Inkrementieren von Eax geht nicht

  Alt 15. Feb 2009, 15:50
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)...
Jan
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Inkrementieren von Eax geht nicht

  Alt 15. Feb 2009, 15:54
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#20

Re: Inkrementieren von Eax geht nicht

  Alt 15. Feb 2009, 16:07
Wie sonst soll es vom Compiler verwaltete lokale Variablen geben?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 02:27 Uhr.
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