far pointer
-
far pointer, ich verstehe sie nicht wenn's da was zu verstehen gibt. Erklährung?
-
VORSICHT, mein Wissen in diesem Bereich ist mehr als lückenhaft...
Manche Compiler besitzen ein Schlüsselwort __far oder FAR (oder wie auch immer), das aber nur in der low level-Programmierung eine Rolle spielt. Der 8086 (erster x86 von Intel) hatte einen Adressraum von 16 Bit, also insgesamt 64K adressierbarer Speicher (near Pointer). Wie selbst Bill Gates behauptete war dies auch eine Zeit lang völlig ausreichend. Um mehr als 16 Bit adressierbar zu machen, führte man die far-Pointer ein indem man den Speicher segmentierte und dann einen Basis-Pointer (auf das Segment; "segment:offset") und ein Offset (vom Beginn des Segmentes) angab. Heutzutage wirst du wohl sehr wenig damit in Kontakt kommen wenn du "normale" Programme schreibst.
Ergänzung #1: in einem Assembler-Buch wirst du wahrscheinlich mehr Informationen finden...
Ergänzung #2: Der C++ Standard kennt keine far-Pointer, macht aber eine Bemerkung...[Note: If there is an additional pointer type __far such that the difference of two __far is of type long, an implementation may define template<class T> struct iterator_traits<T __far*> { typedef long difference_type; typedef T value_type; typedef T __far* pointer; typedef T __far& reference; typedef random_access_iterator_tag iterator_category; }; --- end note]
-
@mastah - gar nicht so falsch
aber man braucht's nicht nur in der Low-Level-Programmierung.
Ein Zeiger ist eine Variable die eine Speicheradresse enthält - also im Prinzip eine Zahl, ein "Offset" in den Hauptspeicher.
Wenn der Adressbus des Prozessors breiter ist als der Datenbus, kommt man mit einer Zahl nicht mehr hin.
Beispiel - der gute alte i286. Datenbus 16 bit - damit kann man 64K Speicherzellen adressieren, Adreßbus aber 20 Bit (1 MB). Also braucht man zwei Zahlen, um eine beliebige Speicherzelle zu adressieren. (Da gibt es nun verschiedene methoden, beim alten Intel war's halt segment:offset, mit lineare adresse = 16*segment+offset)Nun ist die Adreßrechnung mit zwei Zahlen aber recht aufwendig (ganz besonders bei der ruinösen Intel-Adressierung). Solange man also innerhalb eines 64K-Blocks bleibt, hält man das Segment fest, und variiert nur den Daten-Teil: ein "NEAR"-Pointer. Ein FAR - Pointer ist entsprechend ein Zeiger der aus Segment und Offset besteht.
Hier wurde also aus Performance-Gründen auf eine "Kapselung" der Zielplatform verzichtet - ein für C typisches Vorgehen, von dem auch C++ sein Erbe abbekommen hat.
-
Klingt alles ganz gut, aber ein paar Details stimmen nicht: Der 8086 hatte 20Bit Adressbus und der 80286 hatte 24Bit
Dadurch konnte der 8086 1MB Speicher adressieren, wovon die oberen 384KB für Systemdinge vorbehalten waren, was Bill Gates zu der Aussage, 640KB sollten für jedermann ausreichend sein, trieb.
-
Jepp...nachher haben sie sich noch so ein paar lustige Dinge einfallen lassen, um da irgendwie noch ein paar Byte rauszuquetschen - High Memory Area nannte sich das, wenn ich mich recht entsinne. Oder diese lustigen Fehlermeldungen, die Datei sei zu groß, um sie auszuführen. Gerade Spiele waren richtig spaßig. Bis man die 585 KB zusammenhatte, die Alone in the dark 3 brauchte, war schon richtig Getrickse nötig.
Ich erinnere mich noch an nen alten Rechner, ich glaube, ein 386er, der nen SCSI-Controller drinhatte. War dummerweise völlig nutzlos, weil der SCSI-Treiber über 100KB Speicher gefressen hat. Heute fragt man sich, wie die mit so wenig ausgekommen sind...
-
80286 hatte 24Bit
ok ok
konnte im real mode aber nur 20 bit adressieren...Das lustigste waren eigentlich HMA - "High Memory Area" : noch mal 64K, und EMS - da wurde dann Speicher oberhalb von 1MB in ein 64K-Fenster gemappt...