![]() |
Inkrementieren von Eax geht nicht
Ich mir eine FileExists-Funktion geschrieben, die ich auf Speed
testen wollte. Nun, manchmal funktioniert das nicht so ganz - und zwar genau beim Inkrementieren von eax Ich habe leider keine Ahnung warum
Delphi-Quellcode:
MfG
function _FileExists( Filename: PChar ): Boolean; stdcall;
asm push eax call GetFileAttributes inc eax end; -- {Fehlermeldung: Zugriffsverletzung bei Adresse 77CA631B in Modul 'ntdll.dll'. Lesen von Adresse 0153A00C. } |
Re: Problem tretet manchmal auf!
Sehr clever. Schau noch mal nach, was stdcall bedeutet. :mrgreen: Daneben ist dein Titel absolut göttlich. :lol:
|
Re: Problem tretet manchmal auf!
[OT]
Zitat:
|
Re: Problem tretet manchmal auf!
Îch hab mich nicht entscheiden können :)
Sorry leute .. kann einmal passieren :P EDIT: Ich bin verwirrt :(
Code:
eax, ecx und edx Werte können also verwendet / verändert werden ? Ich sehe das Problem nicht.
[u][url]http://de.wikipedia.org/wiki/Aufrufkonvention[/url][/u]
Die stdcall-Aufrufkonvention ist de facto die Standard-Aufrufkonvention für die Microsoft Win32-API. Funktionsparameter werden von rechts nach links übergeben. Die Register EAX, ECX, und EDX sind [b]reserviert für die Verwendung innerhalb der Funktion[/b], werden also unter Umständen verändert. Rückgabewerte werden im EAX-Register zurückgegeben. Anders als bei cdecl bereinigt die aufgerufene Funktion den Stack, nicht die aufrufende Funktion. Wegen dieser Tatsache unterstützen stdcall-Funktionen keine variablen Argumentenlisten. |
Re: Problem tritt (:D) manchmal auf!
gibt deinem Beitrag bitte entsprechend den Forenregeln einen aussagekräftigen Titel :)
In deinem zweiten Satz des ersten Beitrages sind mehr Worte die dein Problem beschreiben also im Titel bei dem man eigentlich diesbezüglich kreativ sein sollte. |
Re: Inkrementieren von Eax geht nicht
Besser so ?:D
Können wir endlich mein Problem behandeln ? |
Re: Inkrementieren von Eax geht nicht
Wenn ich mich gerade richtig erinnere, enthalten EAX, EDX und ECX in dieser Reihenfolge Funktionsparameter. Wäre ja auch Verschwendung, alles auf den Stack zu legen, wenn man so schöne, leckere Register hat ;)
|
Re: Inkrementieren von Eax geht nicht
hast du denn mal in der CPU-Ansicht debuggt um zu sehen ob diese Register wirklich unberührt bleiben?
Zitat:
|
Re: Inkrementieren von Eax geht nicht
Der Wert von Eax ändert sich nach dem Call
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) :S PS: Ja natürlich soll GetFileAttributes Eax verwenden |
Re: Inkrementieren von Eax geht nicht
Hallo,
ein Vorschlag zur Lösung deines Problems: formuliere die Funktion in "reinem" Pascal und studiere den erzeugten Assembler-Code. Du wirst deinen Fehler wahrscheinlich bald finden. Warum möchtest du eigentlich eine Assembler-Routine schreiben? Meiner Meinung nach rechtfertigt die Gesamtlaufzeit der Routine einen derartigen Aufwand nicht. Gruß Hawkeye |
Re: Inkrementieren von Eax geht nicht
Zitat:
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 |
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.
|
Re: Inkrementieren von Eax geht nicht
Zitat:
|
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:
Und du mindestens die unteren 16 Byte auswerten mußt ... also statt Boolean/ByteBool muß schon mindestens WordBool verwendet werden! |
Re: Inkrementieren von Eax geht nicht
Zitat:
Zitat:
Das war mir bewusst :) Das war halt nur die Antwort auf den vorherigen Beitrag. MfG |
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 |
Re: Inkrementieren von Eax geht nicht
wie wärs mit:
Delphi-Quellcode:
dann ist es egal obs stdcall oder register ist.
push FileName
call GetFileAttributes inc eax 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. |
Re: Inkrementieren von Eax geht nicht
Zitat:
![]() |
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.
|
Re: Inkrementieren von Eax geht nicht
Wie sonst soll es vom Compiler verwaltete lokale Variablen geben? ;)
|
Re: Inkrementieren von Eax geht nicht
mr_g
kannst du mir dann ein bsp. geben wo ein
Delphi-Quellcode:
was anderes ist als ein
begin
asm end; end;
Delphi-Quellcode:
würde mich mal interessieren
asm
end; |
Re: Inkrementieren von Eax geht nicht
Wie gesagt... bei einer Funktion oder Prozedur:
Delphi-Quellcode:
Das ist nicht gleich dem:
function Foo(Bar:Integer): Boolean;
asm end;
Delphi-Quellcode:
Die OH sagt dazu:
function Foo(Bar:Integer): Boolean;
begin asm end; end; Zitat:
|
Re: Inkrementieren von Eax geht nicht
Zitat:
Bloß der abschließende Rücksprung wird immer generiert. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 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