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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 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