Segmente



  • Hallo,

    Ich habe schon diverse Tutorials gelesen, aber bei den Segmenten stolpere ich immer, ich verstehs einfach nicht. Wie kann man sich das vorstellen?

    Codesegment: hier wird der Code gespeichert
    Datensegment: Hier werden die Strings, "Variabeln", etc. Infos gespeichert
    Stacksegmet: Ist der Stack (-> verstehe ich)

    Zum Aufbau, wie kann das vorgestellt werden?

    ------------ low address of memory ---------------------
    ----- CS Start ----------------
    ... Code
    ----- CS End ------------------
    ----- DS Start ----------------
    ... Daten
    ----- DS End ------------------
    ----- SS Start ---------------
    ... Stackdaten
    ----- SS End -----------------
    (...?)
    ------------ high address of memory ---------------------

    Es geht hier nicht darum ob die Reihenfolge 100% korrekt ist, sondern ums Prinzip, denn was wohin kommt, kann ich selber nachlesen. Ist der ganze RAM/Memory-Bereich in Segmente aufgeteilt. Können die auch gemixt werden, sprich:

    -- CS
    -- DS
    --- SS
    -- DS
    -- SS etc.

    oder nicht? Bei Windows z.b. hat jeder Prozess die selben Adressen (Virtual Memory), jeder (oder üblicherweise) starten diese an der Adresse 0040100 (oder so). Da gibts verschiedene Sektionen. Wenn ich auf z.B. auf CS zugreife, wird dann automatisch auf .text zugegriffen, oder verwechsle ich hier was? Gibt es auf dieser Ebene auch Segmente?

    Vielen Dank,

    expl0rer

    PS: Dumme Kommentare können erspart bleiben. Wenn jemand dies als eine dumme Frage sieht, dann bitte ich denjenigen dieses Posting zu ignorieren. Danke.



  • Der Speicher an sich ist ein normales Feld, ganz einfach und linear, kann Byteweise adressiert werden.

    Ganz allgemein kann man denke ich sagen, dass ein Segment ein Speicherbereich mit einer bestimmten Basisadresse und Laenge ist und der im Allgemeinen auch einfach nur "Segment" genannte Inhalt zB. eines Segmentregisters einen Zeiger zur Basisadresse eines solchen Speicherbereichs darstellt. Zu diesen Basisadressen wird dann im Weiteren relativ vorzeichenlos adressiert. Diese relativen vorzeichenlosen Adressen nennt man offsets. Der x86 braucht zur Adressierung also immer ein Segment:Offset Paar.

    Wie genau die Lineare Adresse im Speicher nun aus einem solchen Segment:Offset-paar berechnet wird, haengt beim x86 in erster Linie vom Prozessormodus (Real oder Protected) ab. Naeheres dazu kannst du im Protected Mode Tutorial in den FAQ lesen.

    Wie du die Segmente mixen willst, wird mir insofern nicht ganz klar... Segmente koennen sich aber auf jeden Fall auch ueberschneiden.



  • Ah, dann kann es unter umständen sein, dass die Adresse (ich hantiere mit Beispielen) 120h, gleich CS:10h sein könnte? Und, CS:80 wiederum DS:12h?

    danke, und sorry, dass ich das ned schnall bzw. geschnallt hab 🙂

    expl0rer



  • Gut, also Beispiele...
    Im Real Mode berechnet sich die physikalische Speicheradresse einfach aus Segment*16+Offset

    Wenn du CS also auf 0011h setzt und dann ein Offset von 0010h hernimmst, kommst du bei 0011h*10h+0010h=0120h raus. Kann also offensichtlich sein. zB. wenn DS=0000h, wuerde DS:0120h dann uebrigens die selbe Adresse ergeben.

    Wegen og. Formel kann dein 2. Beispiel zumindest im Real Mode dagegen nicht funktionieren, da deine Offsets nicht ein Vielfaches von 16 auseinander liegen... Aber wie gesagt, FAQ...


Anmelden zum Antworten