fehler im tut?



  • Hallo, hab ich ein Denkfehler oder ist im Tut ein Fehler drinne.
    Es müsste an den markierten Stellen doch Bit anstelle von Bytes heißen, oder?

    Um diese Register zu erklären, muß etwas weiter ausgeholt werden.
    Wie bereits gesagt wurde, verfügt der 8086 über einen 16 Bit breiten Datenbus. Zusätzlich enthält er auch noch einen Adressbus, den man sich als ein Bündel von Adressleitungen vorstellen kann. Dieses Bündel umfasst 20 Leitungen. Adressierbar sind damit also 2^20 Bytes (entspricht 1048576 Bytes oder einem Megabyte).
    Sie haben sicherlich schon gehört, daß MSDOS nur ein Megabyte Speicher ansprechen kann. Das ist allerdings weniger ein Problem von DOS, sondern liegt eher in der verzahnten Entstehung von DOS und dem 8086. Aus Kompatibilitätsgründen wurde aus dieser Begrenzung später auch kein richtiger Ausweg gesucht.

    Um auf eine Adresse im Speicher zugreifen zu können, muß sie in einem Register hinterlegt sein. Die Register des 8086 waren aber nur maximal 16 Bit breit. Mit 16 Bit lassen sich aber nur 2^16=65536 Bytes (64 KB) ansprechen.
    Um diesem Dilemma aus dem Weg zu gehen, entschloß man sich, zwei Register für die Adressierung zu verwenden. Damit ließen sich dann immerhin 2^32 Bytes adressieren. Da der Adressraum des 8086 aber nur ein Megabyte (2^20) umfaßte, blieben von den 32 Bit (4 GB) 12 Bit unbenutzt (32-20=12). Aus diesem Grunde verfiel man bei Intel auf die Idee der Segmentierung.

    Als Voraussetzung für die folgenden Überlegungen gehen wir davon aus, daß ein Segment eine bestimmte Anzahl Bytes enthalten kann und im Prozessor ein Register existiert, das eine Segmentnummer enthalten kann. Dieses Register ist 16 Bit breit.

    An welchen Adressen beginnen nun Segmente? Dividieren wir die maximale Größe des Adressraumes durch die maximal mögliche Anzahl an Segmenten, so erhalten wir 2^20 / 2^16 = 2^4 = 16. Ein Segment ist also ein Block mit einer Größe von 16 Bytes. Ein Segment kann demzufolge an jeder Adresse beginnen, die ohne Rest durch 16 teilbar ist. In das Segmentregister muß dann die Nummer des Segmentes eingetragen werden. Dessen Adresse errechnet sich dann so:
    Segmentnummer * 16 Bytes.

    Bis jetzt können wir nur auf Segmente oder besser Segmentgrenzen zugreifen. Um den Zugriff auf einzelne Bytes innerhalb der Segmente zu ermöglichen, wird ein zweites Register verwendet. Dieses enthält einen Zeiger auf ein bestimmtes Byte, letzlich auch nur eine Zahl. Um also das 4. Byte im 6. Segment ansprechen zu können, muß ins Segmentregister der Wert 6 und in das zweite Register der Wert 4 eingetragen werden. Eine vollständige Adresse errechnet sich folgendermaßen:
    Segmentnummer * 16 + Offset(Abstand) zum Segmentanfang

    Dachte immer
    1 Byte = 8 Bit



  • Der Text stimmt so schon. Was haben die Hochzahlen deiner Meinung nach mit den Bits zu tun?

    2^20Bytes sind genau die Anzhl Bytes, die dahinter steht. Wenn du jetzt die Anzahl an Bits haben möchtest, dann musst du diesen Wert mit 8 multiplizieren. Beim Rest ist es genauso.



  • 2^32 Bytes

    Ach damit ist gemeint, dass das Ergebnis in Bytes ist und die 2 nicht mit 32Bytes hochgerechnet wird?

    also 2^32Bits = x Bytes... richtig ?



  • noob.asm schrieb:

    also 2^32Bits = x Bytes... richtig ?

    Wie meinen?

    Bit und Byte sind einfach unterschiedliche Größeneinheiten. Von daher kannst du 2^32 Bit ausdrücken in was du willst.



  • ich denke, hier ist eher ein Fehler im Posting. Die Frage ist nicht wirklich klar und auch die Quelle vom Tut wird nicht genannt, noch Autor, was aber noch schlimmer ist: die Wikis von Lowlevel (brainwave...;-) sind klasse, und die haben auch ein sehr gutes Forum und nette Leute dort, und darum sollte dieses Posting auch für diese dort zu lesen sein und nicht anderswo.

    Die freuen bestimmt darüber und werden deinen Denkfehler gerne aufklären, und hoffentlich bei dieser Gelegenheit merken, dass tatsächlich ein kleiner Fehler im Zitat versteckt ist 😉


Log in to reply