Der Grund, warum es 16 Byte unter dem oberen Rand des Speichers liegt, liegt darin, wie die ursprünglichen 8086-CPU-Register beim Zurücksetzen geladen wurden. Und selbst das hat möglicherweise etwas mit der Kompatibilität für ältere 8085-CPUs zu tun. Diese Kompatibilität wurde auf spätere Chips wie 80286, 80386 usw. übertragen.
Sicher, sie hätten einen beliebigen Wert auswählen können, aber da Interrupt-Vektoren am unteren Rand des Speicherbereichs festgelegt sind, in dem RAM gespeichert werden soll, soll das Programm-ROM oben im Speicherbereich platziert werden.
Während eine beliebige Adresse oben im Speicher ausgewählt werden kann, ist es sinnvoll, so nah wie möglich an den letzten Speicheradressen zu sein, damit nicht festgelegt wird, wie groß der ROM-Bereich sein muss, und Sie können als verwenden kleines ROM wie möglich.
Und es darf auch nicht zu nahe an der letzten Speicheradresse liegen, um genügend Platz für Anweisungen bereitzustellen, um zumindest zu springen und Code an einer anderen Stelle auszuführen. Ein Opcode für einen kurzen Sprung besteht aus zwei Bytes, ein Nahsprung aus drei Bytes und der Weitsprung aus 5 Bytes. Daher ist es sinnvoll, mindestens 5 Bytes für den Bereich zu reservieren.
Da der 8086 über einen 20-Bit-Adressraum (oder 1 Megabyte) verfügt und von den Designern ausgewählt wurde, wird ein segmentierter Speicheransatz verwendet, bei dem Sie ein 16-Bit-Segment und einen 16-Bit-Offset verwenden, um auf eine lineare 20-Bit-Adresse zu verweisen . Dies bedeutet, dass jedes Segmentregister eine Basisadresse für einen 16-Bit-Offset mit einer Basisadressengranularität von 16 Bytes auswählen kann.
Grundsätzlich wurde die Adressierung des 16-Bit-8085 nur um Segmentregister erweitert.
Während des Zurücksetzens der Hardware wird das IP-Register (Program Counter) wie bei einer 8085-CPU auf 0x0000 gesetzt. Und um an das Ende des Speichers zu gelangen, wird das CS-Register (Code Segment) auf 0xFFFF gesetzt. Dadurch startet die CPU ab 16 Byte am Ende des Speichers.
Es gibt viele gültige CS: IP-Kombinationen, die sich zur linearen Adresse von 0xFFFF0 addieren, aber dies war höchstwahrscheinlich die einfachste Methode, da alle Bits im Register mit demselben Wert geladen werden, IP mit null Bits und CS mit einem Bit, so dass das Laden einer speziellen Kombination von Bits in eines der beiden Register nicht erforderlich war.
Spätere CPUs haben diese Kompatibilität jedoch bereits etwas gebrochen, aber auf eine Weise, die nicht viel ausmacht.
Beispielsweise lädt ein 80286 das IP-Register mit 0xFFF0. Und da der 24-Bit-Speicherbus für den Zugriff auf 16 MB Speicher verwendet wird und sich das ROM noch am Ende des adressierbaren 16-MB-Speichers befinden muss, wird der CS-Registerwert auf 0xF000 zurückgesetzt, sodass CS: IP im Real-Modus auf zeigt 0xFFFF0, und die CS-Auswahlbasis wird auf die Basisadresse 0xFF0000 gesetzt, um die physische Speicherbasis festzulegen, so dass die physikalische Adresse 0xFFFFF0 ist.
Auf diese Weise kann das alte 8086-System, wenn Sie es gerade so umgestaltet haben, dass es einen 80286 enthält, kompatibel gemacht werden, um das ursprüngliche ROM zu starten.
Wenn dies auf das 32-Bit-80386 erweitert wurde, lädt es auch das 32-Bit-IP-Register mit 0x0000FFF0, das CS-Register mit 0xF000 und die CS-Auswahlbasis mit 0xFFFF0000, sodass die physikalische Adresse 0xFFFFFFF0 ist. Wenn also ein 80286-System für eine 80386SX-CPU neu konzipiert wurde, kann es kompatibel gemacht werden, um das ursprüngliche ROM zu starten.