Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Der Gottverdammte Stackspeicher

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]
000
02.08.2005, 15:10 Uhr
kanonenvirus



Also hab folgende Frage.
Ihr wisst doch alle was ein Stackspeicher ist und wie er geordnet wird.
Nehmen wir mal an das der Speicher aus mehreren Fächern besteht die von oben nach unten geordnet werden und alle diese Fächer haben eine SSpeicheradresse.
(Beispiel)

Fach (Adresse: 1)
Fach (Adresse: 2)
Fach (Adresse: 3)
Fach (Adresse: 4)

Ich hoffe das könnt Ihr ungefähr verstehen was ich damit meine. Bevor ich aber mit meinem Problem loslege hier nochmal ein einfacher Code zur Übersicht:

1. #include <iostrem>
2. using namespace std;
3.
4. int main2(int, int);
5. int main()
6. {
7. int x = 50, y = 70;
8. main2(x, y);
9. return 0;
10. }
11.
12. int main2(int x, int y)
13. {
14. int z = 80
15. return (x+y);
16. }

also wenn cih jetzt in die main2 Funktion verzweige sprich in Zeile 8, dann wird díese Rückkehradresse auf dem Stackabgelegt. Gleichzetig werden auch die Parameter aus Zeile 8 von rechts nach links auf dem Stack abgelegt. Danach in main2 wird die lokale Variable z auf dem Stac abgelegt und zuletzt wird der Rückgabewert aus der Zeile 15 auf dem Stack abgelegt. Wenn ich es richtig verstanden habe dann müsste es auf dem Stack ungefähr so aussehen:

Fach (Adresse: 1) Rückgabewert
Fach (Adresse: 2) z Variable
Fach (Adresse: 3) Parameter x
Fach (Adresse: 4) Parameter y
Fach (Adresse: 5) Rückkehradresse
Fach Adresse : 6) ......
..
.
.
.
Und was hat es mit diesem Stackzeiger auf sich?

Wenn ich recht habe mit diesem Beispiel dann stimmt mir zu ansonsten Postet soviel Ihr könnt. Aber BITTE keine Ausdrücke wie Arrays oder sonstiges verwenden, da ich noch ein Anfänger bin und gerade in Erfahrung bringe möchte wie die Datenstruktur im Stackspeicher geregelt ist. Schreibt also ungefähr so wie auf dem Niveau des oben einfachen Programms.
Bitte keinen Verweis auf andere Internetseiten ich brauche Hilfe von Profis(^^). Hoffe könnt mir helfen. Danke..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.08.2005, 15:33 Uhr
virtual
Sexiest Bit alive
(Operator)


Du kommst normalerweise in einem Programm - in dem oben stehenden auch nicht - aktiv mit dem Stack in berührung. Das machte der Compiler für Dich. Da ist es eigentlich vollkommen irrelevant, wie die Sachen im Stack angeordnet sind: sowas habe ich höchstens hin und wieder mal für Schweinereien gebraucht, welche ich in diesem Forum nicht preisgebe, weil hier zuviele Minderjährige sind.

Naja, was solls...:
Auf Intel kompatiblen Prozessoren sieht es so aus, daß man pro Funktionsauf einen sogenannten Stackframe auf den Stack wirft. In Deinem Fall etwa so:

Code:

4564 Lokale Variable Z  
4568 Gesicherter Wert des Stackframe der aufrufenden Fkt. (EBP)
456C Rücksprungadresse
4570 Wert Parameter X
4574 Wert Parameter Y
4578 ... Andere Frames



Beachte, daß ein Stack von unten nach oben wächst, dh wenn eine weitere Funktion etwa aufgerufen wird, dann wird der nächste stackframe oben und nicht unten angefügt.

Alle lokalen Variablen und parameter, welche Du in Deiner Routine ansprichst, werden relativ zum Inhalt des Registers EBP angeprochen. Dieses Register wird für jeden Funktionsaufruf neu geladen und der alte Wert ebenfalls auf den Stack zwischengespeichert (siehe Feld 4568).

Beachte weiterhin die Reihenfolge, wie die Rücksprungadresse und die parameter abgelegt werden. In pascal etwa werden die parameter genau umgekehrt abgelaicht. Die Rücksprungadresse wird in C immer als letztes auf den Stack vor dem Funktionseintritt gelegt, was es erlaubt daß eine C Funktion auch dann die Rücksprungadresse zu finden, wenn mehr Parameter als erwartet vom Aufrufere auf den Stack gelegt wurden. Das erst macht sowas wie Variable parameter listen möglich.

Beachte weiterhin, daß das Ergebnis der Funktion nicht über den Stack, sondern in der Regel mit Hilfe eines Registers (EAX) an den Aufrufer zurückgegeben wird.

Dies gilt jedoch alles nur für Intelähnliche Prozessoren. Andere Prozessoren haben zum einen andere Register, zum anderen mag es hier auch weitere Unterschiede geben, wie etwa Ergebnisse an den Aufrufer zurückgegben werden.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.08.2005, 15:50 Uhr
kanonenvirus



http://download.pearsoned.de/leseecke/c++_21Tg/data/kap05.htm
geh mal bitte auf diese seite drauf dann scroll mal runter bis zum stack und versuch mir bitte die dort unten abgebildeten stackbilder zu erklären. Es sit zu undeutlich formuliert finde ich


http://download.pearsoned.de/leseecke/c++_21Tg/data/kap05.htm
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.08.2005, 16:00 Uhr
virtual
Sexiest Bit alive
(Operator)


Kann sein. Also, ich habe keine Lust das zu lesen und verstehen musst Du es selbst. Ich kann es auch nicht besser erklären als eben. Wenn Du folgendes es als C (nicht C++) kompilierst (geht nicht bei einem pedantischen Kompiler), solltest du ungefähr eine Ahnung bekommen, wo welcher Wert liegt und wie er ansprechbar ist:

C++:
#include <stdio.h>

void examine() {
    int* stackPtr = (int*)&stackPtr;
    int local1 = -12;
    int local2 = -34;
    printf("Adresse von stackPtr: %x\n");
    printf("Locale Variable 2: %d\n", *(stackPtr-2)); // oder stackPtr[-2]
    printf("Locale Variable 1: %d\n", *(stackPtr-1));
    printf("Inhalt von EBP: %x\n",  *(stackPtr+1));
    printf("Rücksprungadresse: %x\n", *(stackPtr+2));
    printf("Parameter 1: %d\n", *(stackPtr+3));
    printf("Parameter 2: %d\n", *(stackPtr+4));
    printf("Parameter 3: %d\n", *(stackPtr+5));
    printf("Parameter 4: %d\n", *(stackPtr+6));
    printf("Parameter 5: %d\n", *(stackPtr+7));
}

int main() {
    examine(12, 34, 56, 78, 90);
}



Ausgabe bei mir:

Code:
Adresse von stackPtr: 40028164
Locale Variable 2: -34
Locale Variable 1: -12
Inhalt von EBP: bffff46c
Rücksprungadresse: 8048538
Parameter 1: 12
Parameter 2: 34
Parameter 3: 56
Parameter 4: 78
Parameter 5: 90


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.08.2005, 16:33 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


@kanonenvirus:

keine doppelposts, hab den anderen geschlossen: www.fun-soft.de/showtopic.php?threadid=12204
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.08.2005, 20:24 Uhr
kanonenvirus



4564 Lokale Variable Z
4568 Gesicherter Wert des Stackframe der aufrufenden Fkt. (EBP)
456C Rücksprungadresse
4570 Wert Parameter X
4574 Wert Parameter Y
4578 ... Andere Frames


Was entnimmt ma den jetzt als erstes vom stappel? Die Lokale Variable Z oder den Wert Parameter X


Wenn man die Variable Z wegnimmt dann muss man doch direkt danach die Rückspriungadresse wegneme. Das ist aber unlogisch den dann wird die Funktion ja verlassen und die Parameter bleiben im Stapel.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.08.2005, 20:46 Uhr
virtual
Sexiest Bit alive
(Operator)


Hei, nochmal:
Du machst überhaupt nix mit dem Stack, das macht der Compiler. Du kannst nur indirekt mit dem Stack kommunizieren, indem Du parameter an eine Funktion übergibst und lokale Variablen anlegst. Genausowenig, wie du direkt Platz auf dem Stack für Variablen machen musst, musst oder kannst Du was vom Stack entnehmen. Das ist absolut nichts, was Du in irgendeiner weise wirklich wissen musst.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.08.2005, 21:32 Uhr
kanonenvirus



Cihw eiss das man damit nix macht ich möchte nur das grundprenzip verstehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.08.2005, 21:34 Uhr
Pablo
Supertux
(Operator)


Wie die Sachen auch gelgt und abgelegt werden, hängt von der Rechnerarchitektur ab, es gibt manche, die immer einen Stack brauchen, andere nicht.

Normalerweise legt man etwas auf den Stack und man nimmt (immer) das oberste Element des Stacks ab. Was ist genau, was du wissen möchtest?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.08.2005, 21:38 Uhr
kanonenvirus



PAblo schau dir mal diese seite bitte an ich verstehe dort die fomulierung des stacks nicht. Ich hab das Buch ja selber . Wenn du auf der seite bist scroll mal zu dem Punkt Stack ganz runter und dann versuch es mir zu definieren, wenn es geht. Dankee....
http://download.pearsoned.de/leseecke/c++_21Tg/data/kap05.htm
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: