Wann man mehrere Segmente benutzen, wann ein Segment zu Ende ist und wie Segmentbefehle übersetzt werden



  • Hallo Zusammen !

    Mir ist da noch eine Sache unklar. Naja ok mehrere 😉
    Wann genau kann ich denn mehrere Segmente verwenden ? Wenn ich z.B. unter Dos eine Exe-Datei erstelle, so kann ich meinen Speicher in so viele Segmente unterteilen wie ich will. Zumindest fast. Bei einer Com-Datei wird's schon etwas schwieriger-> ich hab nur ein Segment, nämlich das Codesegment, in dem ich auch meine Daten ablege. Alles klar. Aber ! Was mache ich bei einem Bootloader ? Mal angenommen ich schreibe mir einen. Darf ich dann den Speicher auch in Segmente einteilen ? Mein Problem ist nämlich folgendes wisst ihr:
    Soweit ich das verstanden habe werden ja Segmente erst zur Laufzeit angelegt. Also in der ausführbaren Datei selbst werden die Segmente noch nicht angelegt, oder ? Sonst würde ja jedes Mal wenn ich ein neues Segment anlege auch automatisch die Datei(!) um fast 64KB größer, nicht wahr ? Sondern die Segmente werden erst bei der Ausführung im RAM angelegt. Nur wie ?!?!! Ich meine hä ?? *lach*..wie macht das der Assembler Compiler ??? Gibt es da einen Extra Maschinenbefehl, der der CPU klarmacht dass sie den nacholgenden Code/Daten in ein neues Segment im Arbeitsspeicher laden soll oder...?! Oder managed dass hierbei dann z.B. im Falle eines Bootloaders das Bios ? Aber selbst wenn woran erkennt das BioZ denn dass ich ein neues Segment im Arbeitsspeicher anlegen will für den nachfolgenden Code/Daten/wie auch immer ?
    Ich hoffe mal ihr könnt meinen Gedankengang nachvollziehen *grins*.

    À bientôt 'n' greetz



  • In Forma-Ticker schrieb:

    Soweit ich das verstanden habe werden ja Segmente erst zur Laufzeit angelegt.

    Ne, Segmente existieren im Speicher - einfach so -> Segmentierte Addressierung.

    In Forma-Ticker schrieb:

    der Assembler Compiler

    Es gibt keinen "Assebler Compiler" -> das Ding das du meinst heißt schlichtweg Assembler.

    In Forma-Ticker schrieb:

    Gibt es da einen Extra Maschinenbefehl, der der CPU klarmacht dass sie den nacholgenden Code/Daten in ein neues Segment im Arbeitsspeicher laden soll oder...?!

    Nein!

    In Forma-Ticker schrieb:

    Oder managed dass hierbei dann z.B. im Falle eines Bootloaders das Bios?

    Ne, das BIOS mach nichts anderes als den Bootsektor so wie er ist in den Speicher zu laden und jumpt dann an das erste Byte dieses 512 Byte Blocks.

    In Forma-Ticker schrieb:

    Ich hoffe mal ihr könnt meinen Gedankengang nachvollziehen *grins*.

    Ne, nicht ganz. Ließ mal ein Assembler Tutorial durch.

    Greetz, Swordfish



  • Lol ok nomal von vorne.
    Des mit den Tutorials lass ich lieber. Dat hilft nix. Hab ich schon viele durch nur keines führt zur Beantwortung meiner Frage.

    Hm..ich könnt eigentlich auch gleich so fragen: Was macht der Assembler wenn ich den Befehl "code segment [..] code ends" hernehme ? Ich mein ->nix<- wohl kaum. Klar dass Segmente im Speicher schon vorher existieren! Und den "Assembler Compiler" hab ich extra so geschrieben damit mir hier keiner durcheinanderkommt. Dass des Ding nur Assembler heißt -> weiß ich 🙂

    Nur wenn ich nun "code segment [..] code ends " meinetwegen schreibe und dann "data segment" dann werden doch die daten die nach dem ausdruck "data segment" folgen wohl auch im RAM 64KB vom Anfang des Codesegments entfernt starten ?! Richtig ?! Füllt der Assembler dann den Rest des Codesegments mit Nullen auf bis das Codesegment 64KB lang ist folglich das Data segment dann auch im Speicher in einem "neuen" Segment beginnt. Aber wenn es so wäre würde das doch auch das Binary-File selbst mit Nullen aufblähn.

    Hm...naja deutlicher kann ich net werden. Kann also nur hoffen es versteht mich hier jemand hehe 🙂



  • In Forma-Ticker schrieb:

    Des mit den Tutorials lass ich lieber. Dat hilft nix. Hab ich schon viele durch nur keines führt zur Beantwortung meiner Frage.

    Dann liest du entweder die falschen Tutorials oder bist nicht in der Lage den Inhalt komplett zu verstehen.
    Um Punkt 1 auszuschliessen, koenntest du die 7-Teilige Tutorialreihe in den Assembler FAQ unter ASM TUTORIALS => Intel Syntax Assembler Tutorials durchlesen.

    In Forma-Ticker schrieb:

    Hm..ich könnt eigentlich auch gleich so fragen: Was macht der Assembler wenn ich den Befehl "code segment [..] code ends" hernehme ? Ich mein ->nix<- wohl kaum.

    Grob gesagt fasst der Assembler die Daten zwischen den zwei Assembler-Befehlen nur zu einem Block zusammen (-> Segment genannt).
    Die Adresse und Groesse dieser Segmente wird vom Assembler registriert. Ueber die Namen der Segmente kannst du dir dann die Segment-Adresse holen.
    Das ganze dient also wohl in erster Linie dazu, die Arbeit fuer den Programmierer uebersichtlicher zu gestalten.
    Was die Befehle ansonsten im Einzelnen bewirken, haengt vom verwendeten Assembler und dem Ausgabeformat ab.

    In Forma-Ticker schrieb:

    Nur wenn ich nun "code segment [..] code ends " meinetwegen schreibe und dann "data segment" dann werden doch die daten die nach dem ausdruck "data segment" folgen wohl auch im RAM 64KB vom Anfang des Codesegments entfernt starten ?! Richtig ?!

    idR. nur, wenn das Codesegment 64KByte gross ist, oder du Assembler oder Linker (wie auch immer) so eingestellt hast. Standard ist das wohl kaum.

    In Forma-Ticker schrieb:

    Füllt der Assembler dann den Rest des Codesegments mit Nullen auf bis das Codesegment 64KB lang ist folglich das Data segment dann auch im Speicher in einem "neuen" Segment beginnt.

    Von der Wortstellung her scheint das ja eine Frage zu sein... Sry, du solltest wirklich mehr auf deine Zeichensetzung und Grammatik achten. Dein Geschreibsel ist meist nur muehsehlig zu parsen.
    Wie auch immer: Die Antwort auf diese Frage wuerde fuer den Regelfall "nein." lauten. so.

    Offenbar bist du dem Irrglauben erlegen, dass Segmente immer fix 64KByte gross sein muessen und diese 64KByte-Bloecke im Speicher dicht gepackt hintereinander liegen. Haettest du, wie man dir nahegelegt hat, ein vernuenftiges Tutorial gelesen und verstanden, wuesstest du, dass das nicht der Fall ist.
    Tatsaechlich betraegt der Abstand zwischen Segmenten im RealMode naemlich nur 16 Byte. Hat was mit der Adressierung zu tun. 💡

    In Forma-Ticker schrieb:

    Aber wenn es so wäre würde das doch auch das Binary-File selbst mit Nullen aufblähn.

    Jo, sicher, aber ist dir das ausser bei schlecht programmierten/optimierten in Hochsprachen geschriebenen Programmen jemals aufgefallen? Wohl nur selten.

    In Forma-Ticker schrieb:

    Hm...naja deutlicher kann ich net werden. Kann also nur hoffen es versteht mich hier jemand hehe 🙂

    Dann solltest du dich vielleicht vorrangig erstmal auf deine Sprachskills in Deutsch konzentrieren und Assembler erstmal ruhen lassen. 😉



  • Alles klar. Das reicht.
    Es mag ja vielleicht sein, dass ich in Assembler noch ein "Newbie" bin aber deswegen lass ich mir von Honks noch lange nicht den Appetit verderben.
    Ich sehe es ja auch ein, dass ich da wohl etwas durcheinander gekommen bin (Ein Segment hat 16Byte, ein PARAGRAPH umfasst hingegen 64KB).

    Tut mir leid - bin ja auch nur ein Mensch! Hat auch seine Hintergründe.
    Aber deswegen muss ich mich dafür vor dir noch lange nicht rechtfertigen.
    Es wäre ja auch eine Möglichkeit gewesen mich einfach zu korrigieren. Oder erst gar nicht zu antworten wenn man sich sämtliche Gemeinheiten nicht verkneifen kann oder einfach nicht im Stande dazu ist simpelste Satzkonstruktionen zu verstehen. Und außerdem hast du ja trotzdem verstanden, dass es sich um eine Frage handeln muss. Also wo liegt dann das Problem ?

    Auch meine Zeichensetzung - na und ?! Bin ich hier in einem Forum oder im Deutsch Leistungskurs ? Und wenn wir schon einmal dabei wären: Du schreibst einmal in deiner Antwort '"nein." lauten. so.'. Hinter das "nein" gehört erstens KEIN Punkt und das "so" schreibt man übrigens groß, da es einen neuen Satz einleitet. Soviel dazu! Was will man dazu noch sagen ? Vielleicht:

    "Dann solltest du dich vielleicht vorrangig erstmal auf deine Sprachskills in Deutsch konzentrieren und Assembler erstmal ruhen lassen."

    "Haettest du, wie man dir nahegelegt hat, ein vernuenftiges Tutorial gelesen und verstanden, wuesstest du, dass das nicht der Fall ist." Darauf kann ich nur antworten, dass ich vernünftige Tutorials gelesen habe. Aber halt! Was verstehst du eigentlich unter einem "vernuenftigen" Tutorial ? Gibt es dafür eine Definition ? Und wer hat mir das "nahegelegt" ? Swordfish hat nur von EINEM Tutorial gesprochen. Du erfindest wohl manchmal gerne etwas dazu. 😉

    Anschließend möchte ich nochmals darauf hinweisen, dass du dich hier in einem Forum befindest. Also falls du es dir nicht verkneifen kannst andere Leute niederzumachen und dich in deren Privatsphäre einzumischen...
    "dann solltest du dich vielleicht vorrangig erstmal auf deine Skills in Sachen Menschlichkeit konzentrieren."

    Alles klar ? Schönen Tag noch.



  • In Forma-Ticker tickt nicht mehr richtig...

    1. Wenn man keine Ahnung hat, wie du ja selbst zugegeben hast, sollte man einfach mal gründlich googeln, und nicht irgendwelche armen Forenmenschen mit deinen theoriefragen zu stressen.

    2. Nobuo Ts Rechtschreibung geht schon in ordnung, im gegensatz zu deiner.

    3. "[...]Leute niederzumachen und dich in deren Privatsphäre einzumischen[...]" -> rofl

    4. Wer macht denn hier wen nieder?



  • @In Forma-Ticker:
    Falls du erwarten solltest, dass ich darauf naeher eingehe, muss ich dich enttaeuschen. Meine Intention war es nicht, dich nieder zu machen, sondern dir eine Hilfestellung zu geben.
    Ich finde es wiederum ziemlich daneben, dass du meine Muehen einfach komplett ignorierst, mir derartige Niedertraechtigkeiten unterstellst und obendrein auch noch versuchst, mich zu beleidigen.

    Auch wenn du jetzt noch so uebel beleidigt tun magst: Werd' bitte erstmal deinen Seelenschrott los (aber nicht hier :D), dann koennen wir weiterreden.

    An einer Problemloesung scheint ja hier kein ernsthaftes Interesse mehr zu bestehen...

    Alles klar ? Schönen Tag noch.


Anmelden zum Antworten