Delphi-PRAXiS
Seite 1 von 3  1 23      

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 17:36


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:
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.
}
MfG

Apollonius 14. Feb 2009 17:40

Re: Problem tretet manchmal auf!
 
Sehr clever. Schau noch mal nach, was stdcall bedeutet. :mrgreen: Daneben ist dein Titel absolut göttlich. :lol:

DeddyH 14. Feb 2009 17:43

Re: Problem tretet manchmal auf!
 
[OT]
Zitat:

Nun manchmal tretet da ein Fehler auf
Ich tritt Dich gleich sonstwohin :mrgreen: [/OT]

mr_emre_d 14. Feb 2009 17:45

Re: Problem tretet manchmal auf!
 
Îch hab mich nicht entscheiden können :)

Sorry leute .. kann einmal passieren :P

EDIT: Ich bin verwirrt :(

Code:
[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.
eax, ecx und edx Werte können also verwendet / verändert werden ? Ich sehe das Problem nicht.

SirThornberry 14. Feb 2009 18:56

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.

mr_emre_d 14. Feb 2009 19:03

Re: Inkrementieren von Eax geht nicht
 
Besser so ?:D

Können wir endlich mein Problem behandeln ?

Dax 14. Feb 2009 19:05

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 ;)

SirThornberry 14. Feb 2009 19:07

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:

Die Register EAX, ECX, und EDX sind reserviert für die Verwendung innerhalb der Funktion
heißt das nciht auch das GetFileAttributes diese verwenden könnte?

mr_emre_d 14. Feb 2009 19:16

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

Hawkeye219 14. Feb 2009 19:18

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


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

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