WikiDer > LOADALL

LOADALL

ALLE LADEN ist ein undokumentierter Anweisung von einigen Mikroprozessoren von Intel.

LOADALL kann alle Register des Prozessors mit einem Befehl laden. Interessanterweise auch die Segmentdeskriptoren unabhängig von den Segmentregistern geladen werden, wodurch unter anderem in echte Mode das Ganze Erinnerung des 80286 zu nähern.

Die Anweisung erscheint auf dem 80286 und der 80386, aber die Bedienung ist bei diesen beiden Prozessoren völlig unterschiedlich.

80286

Der Maschinencode auf dem 80286 ist 0F05. Der Befehl lädt Daten von Adresse 00800-00866 unabhängig vom Inhalt der Segmentregister. Jetzt werden diese Adressen normalerweise von den Betriebssystem für andere Zwecke verwendet. Man muss also den Inhalt dieser Adressen woanders speichern und die gewünschten Daten auf diese Adressen setzen, bevor man LOADALL ausführt. Dies macht LOADALL zu einem ziemlich langsamen Vorgang.

Obwohl das MSW geladen wird, erlaubt LOADALL keine Rückkehr von Sicherheitsmodus zu echte Mode.

AdresseRegister
00800
nicht benutzt
MSW, Maschinenstatuswort
00808
nicht benutzt
00810
nicht benutzt
00816
TR, Aufgabenregister
Flaggen
IP, Anweisungszeiger
LDTR, lokales Deskriptortabellenregister
0081E
DS-Daten Segment
SS-Stack-Segment
CS-Codesegment
ES Extra-Segment
00826
DI-Zielindex
SI-Quellindex
BP-Basiszeiger
SP-Stack-Zeiger
0082E
BX
DX
CX
AXT
00836
0083C
CS-Segmentdeskriptor
00842
SS-Segmentdeskriptor
00848
DS-Segmentdeskriptor
0084E
GDT, globale Deskriptortabelle
00854
LDT, lokale Deskriptortabelle
0085A
IDT, Interrupt-Deskriptor-Tabelle
00860
TSS, Aufgabenzustandssegment

80386

Der Maschinencode auf dem 80386 ist 0F07. Der Befehl lädt Daten von der durch ES:EDI bezeichneten Adresse. Dies verwendet tatsächlich ES und nicht den ES-Deskriptor.

AdresseRegister
ES:EDI 00
CR0, Steuerregister 0
FLAGS
EIP, Anweisungszeiger
ES:EDI 0C
EDI, Zielindex
ESI-Quellindex
EBP, Basiszeiger
ESP, Stapelzeiger
ES: EDI 1C
EBX
EDX
ECX
EAX
ES: EDI 2C
DR6
DR7
TR, Task-Zustandsauswahl
LDTR, lokale Deskriptortabelle
ES: EDI 3C
GS, Zusatzsegment
nicht benutzt
FS, zusätzliches Segment
nicht benutzt
DS, Datensegment
nicht benutzt
ES: EDI 48
SS, Stapelsegment
nicht benutzt
CS, Codesegment
nicht benutzt
ES, zusätzliches Segment
nicht benutzt
ES: EDI 54
TSS-Deskriptor, Task-Status-Selektor
ES: EDI 60
IDT-Deskriptor, Interrupt-Deskriptor-Tabelle
ES: EDI 6C
GDT-Deskriptor, globale Deskriptortabelle
ES: EDI 78
LDT-Deskriptor, lokale Deskriptortabelle
ES: EDI 84
ES: EDI 90
FS-Segmentdeskriptor
ES: EDI 9C
DS-Segmentdeskriptor
ES: EDI A8
SS-Segmentdeskriptor
ES: EDI B4
CS-Segmentdeskriptor
ES:EDI C0
ES-Segmentdeskriptor

Andere Prozessoren

Soweit wir wissen, ist der LOADALL-Befehl nur auf dem 80286 und 80386 verfügbar. Andere Prozessoren können jedoch einen ähnlichen Befehl ausführen, solange sie wissen, was der Opcode ist und welchen Wert die Register haben sollen.

Das Problem ist, dass längst nicht alle Eigenschaften der Prozessoren dokumentiert sind. Auch einfach alle Möglichkeiten auszuprobieren ist nicht machbar – dafür sind es zu viele. Einige Opcodes verhalten sich als ungültige Anweisungen, es sei denn, die Register enthalten einen speziellen Wert – der vom Hersteller geheim gehalten wird.