Autor Thema: Aufruf C-Funktionen  (Gelesen 2622 mal)

ehenkes

  • Gast
Gespeichert
« am: 06. June 2009, 20:16 »
Habe mich durch das Thema "Aufruf von C-Funktionen" vor allem bezueglich stack aus Sicht von caller und callee gearbeitet. Soweit alles klar.

Dazu noch folgende Fragen:
- ENTER / LEAVE vorteilhaft gegenueber mov .../pop ...? (unterschiedliche Handhabung in den Compilern? Mein DJGPP verwendet letzteres)
- Warum speichert caller - falls notwendig - EAX, ECX, EDX?
- Warum speichert callee - falls notwendig - EBX, ESI, EDI?
- Wozu verwendet der callee den Bereich "temporary storage" (neben local variables)? Konkretes Beispiel?
- Ist "pop eip" gleich "ret"?
- Ist "push eip" plus "jmp foo" gleich "call foo"?
Wenn nein, warum nicht? Gibt es eine Aequivalenz?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 06. June 2009, 20:59 »
Dazu noch folgende Fragen:
- ENTER / LEAVE vorteilhaft gegenueber mov .../pop ...? (unterschiedliche Handhabung in den Compilern? Mein DJGPP verwendet letzteres)
Hat für C-Compiler keine Vorteile außer der Kürze. Auf alten CPUs unterscheiden sich die Instruktionen in der Ausführungsgeschwindigkeit.

- Warum speichert caller - falls notwendig - EAX, ECX, EDX?
- Warum speichert callee - falls notwendig - EBX, ESI, EDI?
Konvention. Die aufgerufene Funktion darf EAX, ECX, und EDX verändern, aber EBX, ESI, und EDI nicht. Wenn der Aufrufer EAX, ECX, oder EDX braucht, muss er sie deswegen selbst sichern und nach dem Aufruf wiederherstellen. Wenn der Aufgerufene EBX, ESI, oder EDI braucht, muss er sie selbst sichern und später wiederherstellen.

Die Einteilung in diese zwei Klassen hat vermutlich den Grund, dass die einen eher für Speicherzugriffe sind, die anderen für arithmetische Operationen. Aber bereits seit dem 386er ist diese Trennung obsolet.

Zitat
- Wozu verwendet der callee den Bereich "temporary storage" (neben local variables)? Konkretes Beispiel?
Wenn dem Compiler bei aufwändigen Rechnungen die Register für Zwischenergebnisse ausgehen, speichert er die da.

Zitat
- Ist "pop eip" gleich "ret"?
- Ist "push eip" plus "jmp foo" gleich "call foo"?
Wenn es das gäbe, dann ja.
« Letzte Änderung: 06. June 2009, 21:04 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 07. June 2009, 03:19 »
Thanks.  :-)

Zitat
Wenn es das gäbe, dann ja.

 :?

Hi,

eip ist ja nicht modifizierbar, bis auf den indirekten Weg durch jumps. Ich glaube das meint er. Also pop/push eip ist in der Praxis nicht möglich.
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 07. June 2009, 13:57 »
Zitat
eip ist ja nicht modifizierbar, bis auf den indirekten Weg durch jumps. ... pop/push eip ist in der Praxis nicht möglich.

Die Paarung call/ret hat also ein Alleinstellungsmerkmal (als jeweils letzter Befehl der caller- bzw. callee-Strecke) und kann nicht nachgebildet werden?
Ja. Das gilt allerdings für die meisten Befehle. Auch das Design einer RISC-CPU vermeidet redundante/überflüssige Befehle.
Dieser Text wird unter jedem Beitrag angezeigt.

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 10. June 2009, 14:03 »
Ich fande auch das die pdf sehr ausfürhlich das Thema C/C++ mit Assembler beschreibt, deswegen hatte ich ja auch den link rein geschrieben :-D
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

 

Einloggen