Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

x86 CDECL Register

nand - 32
Fortgeschrittener (offline)

Dabei seit 09.2010
45 Beiträge

Geschrieben am: 29.05.2011 um 01:10 Uhr
Zuletzt editiert am: 29.05.2011 um 01:13 Uhr

Weiß jemand, welche x86 Register unter verwendung von CDECL als volatile gelten?

Ich versuche dies schon seit einiger Zeit im Internet herauszufinden. (Ich habe nur folgende Informationen für die x64 ABI gefunden, aber nichts für CDECL: http://msdn.microsoft.com/en-us/library/6t169e9c.aspx )

Grund der Nachfrage ist ein Beispiel-code einer CDECL Funktion, in dem EBX gespeichert wird, aber ECX nicht. Ist dies ein Fehler im Code oder müssen nur bestimmte Register gespeichert werden?

ナノちゃん

TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 29.05.2011 um 01:25 Uhr
Zuletzt editiert am: 29.05.2011 um 01:35 Uhr

die cdecl sagt so wie ich das in wikipedia verstanden hab nix darüber aus, welche register als volatile gelten und welche nicht. prinzipiell würde ich mal schätzen, dass du alle register, die du schreibend verwendest erstmal sichern solltest. und wenn in deinem beispiel ecx nicht gespeichert wird, wird es eventuell auch nicht überschrieben?
diese variante wäre zumindest zu bevorzugen, da jeder zugriff auf den stack lange ladezeiten nach sich zieht (selbst, wenns nur in den cache und nich gleich ins ram geht). nur auf den registern arbeiten ist mit abstand die schnellste variante, weswegen man speicherzugriffe so oft wie möglich vermeiden sollte...

EDIT: Hab nochmal ein bisschen weiter gesucht:
Auf seite 10 im Kapitel Register Usage findest du eine schöne Tabelle, die dir sagt, dass
EAX, ECX, EDX,
ST(0)-ST(7),
XMM0-XMM7,
YMM0-YMM7
volatile register sind und register
EBX, ESI, EDI, EBP
non-volatile register sind.
dein beispiel handelt also korrekt.

Mörps mörps blubbs!

nand - 32
Fortgeschrittener (offline)

Dabei seit 09.2010
45 Beiträge

Geschrieben am: 29.05.2011 um 01:35 Uhr
Zuletzt editiert am: 29.05.2011 um 01:37 Uhr

Zitat von TheBrainless:

die cdecl sagt so wie ich das in wikipedia verstanden hab nix darüber aus, welche register als volatile gelten und welche nicht. prinzipiell würde ich mal schätzen, dass du alle register, die du schreibend verwendest erstmal sichern solltest. und wenn in deinem beispiel ecx nicht gespeichert wird, wird es eventuell auch nicht überschrieben?
diese variante wäre zumindest zu bevorzugen, da jeder zugriff auf den stack lange ladezeiten nach sich zieht (selbst, wenns nur in den cache und nich gleich ins ram geht). nur auf den registern arbeiten ist mit abstand die schnellste variante, weswegen man speicherzugriffe so oft wie möglich vermeiden sollte...


Es ist eigentlich nur wichtig, zu wissen, von welchen Registern man erwarten kann, dass diese beim Aufruf von externen Unterfunktionen zerstört werden. Beispiel: Ich schreibe eine schleife (und benutze ECX zum Zählen), in dieser Schleife werden Unterfunktionen ausgerufen, welche Intern auch eine Schleife beinhalten - wenn der ECX Wert beim aufrufen zerstört wird, muss er prinzipiell irgendwo auf den Stack gespeichert werden - ob dies in der Funktion selbst passiert oder im ausführenden Code macht meiner Meinung nach wenig unterschied.

Sollte ich also einfach davon ausgehen, dass alle Register zerstört werden, und Werte die ich nach dem Aufruf noch benötige auf den Stack speichern?

Zitat von TheBrainless:

EDIT: Hab nochmal ein bisschen weiter gesucht:
Auf seite 10 im Kapitel Register Usage findest du eine schöne Tabelle, die dir sagt, dass
EAX, ECX, EDX,
ST(0)-ST(7),
XMM0-XMM7,
YMM0-YMM7
volatile register sind und register
EBX, ESI, EDI, EBP
non-volatile register sind.
dein beispiel handelt also korrekt.


Edit: Danke für die PDF, ich habe sie selber nicht gefunden. Jetzt ist es mir auch klar, warum mein Beispiel nur EBX speicherte. Dieser Thread ist somit beantwortet.

ナノちゃん

TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 29.05.2011 um 01:37 Uhr

Zitat von nand:

Sollte ich also einfach davon ausgehen, dass alle Register zerstört werden, und Werte die ich nach dem Aufruf noch benötige auf den Stack speichern?


siehe mein edit. aber im zweifelsfall solltest du bei fremdem code immer davon ausgehn, dass alles kaputt ist (außer, du hast die garantie, dass der entwickler des fremden codes sich an die konventionen hält).

Mörps mörps blubbs!

  [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -