Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Assembler ::  Stdcall - Welche Register sichern !?  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Stdcall
Unregistrierter




Beitrag 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
Beitrag 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




Beitrag 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
Beitrag 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




Beitrag 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




Beitrag 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 :live:
Patrickssj6
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.01.2012
Beiträge: 87
Beitrag 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




Beitrag 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
Beitrag 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




Beitrag 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.
C/C++ Forum :: Assembler ::  Stdcall - Welche Register sichern !?  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.