Adressierung ... 64 Kb ?

Akilein

Mitglied
hi Leute!

ich lese gerade das Buch von Marcus Roming (Assembler)
da steht, dass man mit einem 16-Bit-Register lediglich 64 Kb ansprechen kann und da ich immer alles ganz genau wissen muss :p hab ich nachgerechnet und das stimmt ja nicht ... 1111 1111 1111 1111 ist aber nur 65535 und 65535/1024 ist nur 63.999 ... Kb, also ist das Buchi falsch gedruckt oder hat der nette Marcy aufgerundet oder ist das die Erklärung für die vielen Abstürze? :D

ps: noch etwas ... da steht der gesamte Speicher wird in 65536 Paragraphen von je 16 Byte unterteilt und dass der 16-Bit-Segmentregister auf die Anfänge der Paragraphen zeigen kann, abgesehen davon, dass er auf den letzen gar nicht mehr zeigen kann, weil ein 16-Bit-Register nur bis 65535 raufkann, benötigt man doch für die Offsetadresse, doch nicht noch einen 16-Bit-Register oder? weil die restlichen 16 Byte pro Paragraph erfordern doch nur mehr einen Register, wo halt die Zahl 16 reinpasst, weil der PC liest ja byte-weise herauß, also muss er entweder auf den 1, 2, 3 ... oder 16. Byte zeigen ... verstehe ich also nicht aja und was ist der Unterschied zw. Segment und Paragraph ? ... hmm

thx für die Antwort

Akosch
 
Zuletzt bearbeitet:
Akilein hat gesagt.:
da steht, dass man mit einem 16-Bit-Register lediglich 64 Kb ansprechen kann und da ich immer alles ganz genau wissen muss :p hab ich nachgerechnet und das stimmt ja nicht ... 1111 1111 1111 1111 ist aber nur 65535 und 65535/1024 ist nur 63.999 ... Kb
Ein 16-Bit-Register kann 2^16 = 65.536 Zustände annehmen. Die höchste darstellbare vorzeichenlose Ganzzahl ist 65.535, die niedrigste 0. (Genauso wie es 11 Ganzzahlen zwischen jeweils einschließlich 0–10 gibt, und nicht 10.)

ps: noch etwas ... da steht der gesamte Speicher wird in 65536 Paragraphen von je 16 Byte unterteilt und dass der 16-Bit-Segmentregister auf die Anfänge der Paragraphen zeigen kann, abgesehen davon, dass er auf den letzen gar nicht mehr zeigen kann, weil ein 16-Bit-Register nur bis 65535 raufkann, …
Siehe oben (65.536 Zustände).

… benötigt man doch für die Offsetadresse, doch nicht noch einen 16-Bit-Register oder?
Nein, eigentlich würden 4 Bits für den Offset reichen, um ein komplettes Megabyte Speicher anzusprechen. Warum man trotzdem ein komplettes 16-Bit-Register verwendet, kann man im entsprechenden Wikibook zum Thema Assembler nachlesen.

aja und was ist der Unterschied zw. Segment und Paragraph ?
Paragraph und Segment sind in diesem Kontext gleichbedeutend.
 
hi thx für die Antwort! das vertehe ich jetzt, aber mir ist noch eine Kleinigkeit unklar

"Jedes Segment ist maximal 64 KB breit"
"Die Segmente sind immer 16 Byte weit auseinander."
wie soll das gehen? 64 KB müssten doch 65.536 Byte haben (64*1024)

wenn die Segmente aber nur 16 Byte Abstand von einander haben, wie soll denn das dann gehen?
"Segmente können sich gegenseitig überlappen. Grund: Sie haben eine Größe von maximal 64 KB, liegen aber nur 16 Byte auseinander"
sollte die Antwort auf meine Frage sein, verstehe ich aber nicht
 
Wie gesagt, die Segmente können sich überlappen. Vielleicht hilft es, wenn man sich nicht vorstellt, dass der Speicherbereich in 16-Byte-Blöcke unterteilt wird, sondern dass lediglich alle 16 Bytes eine neues Segment anfängt. Wie groß dieses ist, ist nicht festgelegt.
 
hi, thx das verstehe ich jetzt auch!
könntest du mir vielleicht noch bitte diesen Satz erläutern:
COM und EXE-Dateien werden in aller Regel der gesamte verfügbare Speicher zugeordnet (DOS)

ich versteh das nicht, im letzten Kapitel schrieb er, dass Com-Dateien genau in ein Segment, also 64 KB passen, also wird der Datei nur 64 KB zugeordet, doch nicht der gesamte Speicher ...
zur Zeit geht es im Buch darum, wie man den nicht benötigten Speicher freigibt (Grafikprogrammierung) ... aber 64 is e schon so wenig, wie soll man da noch was freigeben

thx
 

Neue Beiträge

Zurück