| Autor |
Nachricht |
Stdcall
Unregistrierter
|
Stdcall Unregistrierter
19:28:43 09.01.2012 Titel: |
Stdcall - Welche Register sichern !? |
Zitieren |
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. |
|
|
|
 |
zeusosc
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.12.2006
Beiträge: 745
|
zeusosc Mitglied
19:59:42 09.01.2012 Titel: |
|
Zitieren |
Vlt. hilft Dir das weiter
http://www.nynaeve.net/?p=53 |
_________________ Der Contrapart in einer Diskussion zu sein, heißt nicht das dieser Standpunkt
der eigene sein muss!
|
|
 |
Stdcall
Unregistrierter
|
Stdcall Unregistrierter
20:11:16 09.01.2012 Titel: |
|
Zitieren |
Danke erstmal für den Link, aber da wird meine Frage auch nicht klar beantwortet... |
|
|
|
 |
Patrickssj6
Mitglied
Benutzerprofil
Anmeldungsdatum: 08.01.2012
Beiträge: 87
|
Patrickssj6 Mitglied
20:46:48 09.01.2012 Titel: |
|
Zitieren |
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. |
|
|
|
 |
masm
Unregistrierter
|
masm Unregistrierter
21:34:45 09.01.2012 Titel: |
|
Zitieren |
| 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 |
msdn: x86 Architecture |
|
|
|
 |
Stdcall
Unregistrierter
|
Stdcall Unregistrierter
00:35:57 10.01.2012 Titel: |
|
Zitieren |
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 |
|
|
|
 |
Patrickssj6
Mitglied
Benutzerprofil
Anmeldungsdatum: 08.01.2012
Beiträge: 87
|
Patrickssj6 Mitglied
14:00:46 10.01.2012 Titel: |
|
Zitieren |
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. |
|
|
|
 |
Stdcall
Unregistrierter
|
Stdcall Unregistrierter
15:31:21 10.01.2012 Titel: |
|
Zitieren |
| Zitat: | | 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 |
|
|
|
 |
Patrickssj6
Mitglied
Benutzerprofil
Anmeldungsdatum: 08.01.2012
Beiträge: 87
|
Patrickssj6 Mitglied
16:19:29 10.01.2012 Titel: |
|
Zitieren |
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. |
|
|
|
 |
masm
Unregistrierter
|
masm Unregistrierter
16:43:10 10.01.2012 Titel: |
|
Zitieren |
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. |
|
|
|
 |