Stdcall - Welche Register sichern !?
-
Guten Abend,
welche Register sollte man in seiner stdcall Funktion sichern, welche "darf" man manipulieren?
Ich meine einmal gelesen zu haben, dass EAX, ECX, EDX der Funktion zur Verfügung stehen...
Stimmt das? Und wenn ja, warum sollten dann gerade ESI, EDI und vor allem EBX gesichtert werden?Einen schönen Abend noch.
-
Vlt. hilft Dir das weiter
-
Danke erstmal für den Link, aber da wird meine Frage auch nicht klar beantwortet...
-
stdcall Funktion sagt nicht zwangsweise aus welche Register in einer Funktion alle benutzt werden, nur welche beim Aufruf und Return benutzt werden. Welche Register benutzt werden hängt von dem code in der Funktion ab.
Und daher dass du das meistens nicht weißt, sichert man es mit nem PUSHAD und POPAD ab.
-
msdn schrieb:
The x86 architecture has several different calling conventions. Fortunately, they all follow the same register preservation and function return rules:
• Functions must preserve all registers, except for eax, ecx, and edx, which can be changed across a function call, and esp, which must be updated according to the calling convention
-
Genau das ist der Text den ich mal gelesen hatte. Das heißt also, ich sichere alle Register in der Funktion, außer eax, ecx und edx, sofern ich sie verändere.
Kann mir jemand evtl. noch sagen, warum es gerade DIE Register sind?
Ich danke euch jedenfalls schonmal
-
Sicher einfach alle ab mit PUSHAD. Verschwendet ein paar bytes mehr Speicher aufm Stack ist aber schneller und sicherer.
Es sind genau die Register weil es die General Purpose Register sind und wie der Name schon sagt, die Register für generelle Anwendungen sind. Die anderen Register wie z.B ESP haben eine bestimmte Funktion (ESP zeigt immer auf den Stack, Extended Stack Pointer). EBP ist der Extended Base Pointer, EIP ist der Extended Instuction Pointer. Wenn du unkontrolliert eines der drei veränderst, crasht dein Programm.
ESI und EDI sind zwar auch General Purpose Register werden aber oft für Schleifen etc benutzt. Wenn du die vorher mit PUSHAD absicherst, kannst du die natürlich auch benutzen.
Kommt aber natürlich drauf an was du überhaupt bezwecken willst.
-
Es sind genau die Register weil es die General Purpose Register sind und wie der Name schon sagt, die Register für generelle Anwendungen sind
Hab ich mir gedacht, mich hat nur gewundert, warum EBX nicht dabei ist...
Naja gut, PUSHAD könnte ich verwenden, mir ging es nur darum aus PerformanceGründen (Da der RAM ja "langsam[er]" ist) möglichst wenige Register zz pushen.
Danke
-
Abhängig davon was du noch machen wirst musst du auch die Flags absichern (z.B wenn du CMP benutzt) müssen (mit PUSHFD).
Ob PUSHAD oder PUSH EAX,EBX,EDX etc. schneller ist, kann ich nicht sagen. Persönlich denke ich aber das PUSHAD schneller ist.
-
Das ganze hängt doch vom Betriebssystem ab. Unter Windows ist die Sache klar: Wenn du ESI,EDI oder EBX benutzt, musst du sie halt entsprechend sichern. PUSH/POPAD ist unnötig und sicherlich nicht schneller, als wenn man nur die Benötigten Register sichert. Die eFlags braucht man nicht zu sichern. Einzig das DF muss man auf 0 zurücksetzen, sofern man es gesetzt hat (was äußerst selten vorkommt). Für die FPU gilt: das Control-Register muss man sichern wenn man es ändert. Der FPU-stack muss leer sein, ausgenommen man gibt eine Wert duch ST(0) zurück.
-
Danke euch!