WikiDer > 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.
| Adresse | Register | |||||||
|---|---|---|---|---|---|---|---|---|
| 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.
| Adresse | Register | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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.