x86-Programmierung und -Betriebsarten (Teil 6)

Adressen im Virtual-8086-Mode

Auf den ersten Blick besteht der wesentlichste Unterschied zwischen Real und Protected Mode in der Art der Adressberechnung. Im Real Mode wird einfach der Wert des Segmentregisters mit 16 multipliziert. Im Protected Mode dient das Segmentregister dagegen als Index in eine Tabelle, in der die "richtigen" Adressen der Segmente stehen. Dadurch ist es zum Beispiel völlig unmöglich, aus einem Segment- und Offsetregisterwert unmittelbar auf die lineare Adresse des Objekts zu schließen. Genau dies praktizieren jedoch viele alte Real-Mode-Programme, eine ordnungsgemäße Ausführung im Protected Mode ist dadurch unmöglich.

Soll der 32-Bit-Prozessor nun im Virtual Mode die Ausführung von 8086-Programmen ermöglichen, so muss er die Adresse wie der 8086 im Real Mode berechnen. Im Virtual-8086-Mode erzeugt der Prozessor also die Adresse, indem er den Wert des Segmentregisters mit 16 multipliziert und den Offset hinzuaddiert. Beachten Sie, dass der 80386 32-Bit-Offsetregister kennt, der 8086 dagegen nicht. Virtuelle 8086-Tasks können daher durch das Address-Override-Präfix lineare 32-Bit-Adressen erzeugen. Übersteigt der Wert eines 80386-Offsetregisters im Virtual Mode den Wert 65535 oder ffffh, so löst die CPU eine Pseudo-Protection-Exception 0ch oder 0dh aus, ohne einen Fehlercode anzugeben. Die Kombination eines Segments ffffh und eines Offsets ffffh führt wie im gewöhnlichen Real Mode zu einer Adresse 10ffefh. Auch im Virtual Mode wird also die 1 MByte-Grenze um knapp 64 KByte durchbrochen.