AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

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 1 von 3  1 23   
mr_emre_d
(Gast)

n/a Beiträge
 
#1

Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 18:36
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
  Mit Zitat antworten Zitat
Apollonius

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

Re: Problem tretet manchmal auf!

  Alt 14. Feb 2009, 18:40
Sehr clever. Schau noch mal nach, was stdcall bedeutet. Daneben ist dein Titel absolut göttlich.
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 DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Problem tretet manchmal auf!

  Alt 14. Feb 2009, 18:43
[OT]
Zitat:
Nun manchmal tretet da ein Fehler auf
Ich tritt Dich gleich sonstwohin [/OT]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#4

Re: Problem tretet manchmal auf!

  Alt 14. Feb 2009, 18:45
Îch hab mich nicht entscheiden können

Sorry leute .. kann einmal passieren

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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Problem tritt (:D) manchmal auf!

  Alt 14. Feb 2009, 19:56
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#6

Re: Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 20:03
Besser so ?

Können wir endlich mein Problem behandeln ?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#7

Re: Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 20:05
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 20:07
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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#9

Re: Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 20:16
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Inkrementieren von Eax geht nicht

  Alt 14. Feb 2009, 20:18
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:53 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