LOADALL
LOADALL is een ongedocumenteerde instructie van sommige microprocessors van Intel.
LOADALL kan met één instructie alle registers van de processor laden. Interessant is dat ook de segmentdescriptors worden geladen, onafhankelijk van de segmentregisters, waardoor het onder andere mogelijk is in real mode het hele geheugen van de 80286 te benaderen.
De instructie komt voor op de 80286 en de 80386, maar de werking is op die twee processors geheel anders.
80286
[bewerken | brontekst bewerken]De machinecode op de 80286 is 0F05. De instructie laadt gegevens van adres 00800-00866, ongeacht de inhoud van de segmentregisters. Nu worden die adressen meestal door het besturingssysteem voor andere doelen gebruikt. Men moet dus de inhoud van die adressen elders redden en de gewenste gegevens op die adressen zetten voordat men LOADALL uitvoert. Hierdoor is LOADALL een vrij trage bewerking.
Hoewel het MSW wordt geladen, is het met LOADALL niet mogelijk terug te keren van protected mode naar real mode.
Adres | Registers | |||||||
---|---|---|---|---|---|---|---|---|
00800 | niet gebruikt |
MSW, machine status word | ||||||
00808 | niet gebruikt | |||||||
00810 | niet gebruikt |
|||||||
00816 | TR, task register |
flags |
IP, instruction pointer |
LDTR, local descriptor table register | ||||
0081E | DS data segment |
SS stacksegment |
CS codesegment |
ES extra segment | ||||
00826 | DI destination index |
SI source index |
BP base pointer |
SP stack pointer | ||||
0082E | BX |
DX |
CX |
AX | ||||
00836 | ||||||||
0083C | CS segmentdescriptor | |||||||
00842 | SS segmentdescriptor | |||||||
00848 | DS segmentdescriptor | |||||||
0084E | GDT, global descriptor table | |||||||
00854 | LDT, local descriptor table | |||||||
0085A | IDT, interrupt descriptor table | |||||||
00860 | TSS, task state segment |
80386
[bewerken | brontekst bewerken]De machinecode op de 80386 is 0F07. De instructie laadt gegevens van het adres dat wordt aangewezen door ES:EDI. Hierbij wordt inderdaad ES gebruikt en niet de descriptor van ES.
Adres | Registers | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ES:EDI+00 | CR0, control register 0 |
EFLAGS |
EIP, instruction pointer |
|||||||||||||
ES:EDI+0C | EDI, destination index |
ESI, source index |
EBP, base pointer |
ESP, stack pointer | ||||||||||||
ES:EDI+1C | EBX |
EDX |
ECX |
EAX | ||||||||||||
ES:EDI+2C | DR6 |
DR7 |
TR, task state selector |
LDTR, local descriptor table | ||||||||||||
ES:EDI+3C | GS, extra segment |
niet gebruikt |
FS, extra segment |
niet gebruikt |
DS, datasegment |
niet gebruikt |
||||||||||
ES:EDI+48 | SS, stacksegment |
niet gebruikt |
CS, codesegment |
niet gebruikt |
ES, extra segment |
niet gebruikt | ||||||||||
ES:EDI+54 | TSS descriptor, task state selector | |||||||||||||||
ES:EDI+60 | IDT descriptor, interrupt descriptor table | |||||||||||||||
ES:EDI+6C | GDT descriptor, global descriptor table | |||||||||||||||
ES:EDI+78 | LDT descriptor, local descriptor table | |||||||||||||||
ES:EDI+84 | ||||||||||||||||
ES:EDI+90 | FS segmentdescriptor | |||||||||||||||
ES:EDI+9C | DS segmentdescriptor | |||||||||||||||
ES:EDI+A8 | SS segmentdescriptor | |||||||||||||||
ES:EDI+B4 | CS segmentdescriptor | |||||||||||||||
ES:EDI+C0 | ES segmentdescriptor |
Andere processors
[bewerken | brontekst bewerken]Voor zover bekend is de instructie LOADALL alleen beschikbaar op de 80286 en 80386. Het is echter mogelijk dat andere processors een soortgelijke instructie uitvoeren als men maar weet wat de opcode is en welke waarde de registers moeten hebben.
Het probleem is namelijk dat lang niet alle eigenschappen van de processors gedocumenteerd zijn. Ook domweg alle mogelijkheden proberen is niet haalbaar - daarvoor zijn het er te veel. Sommige opcodes gedragen zich als ongeldige instructie tenzij de registers een speciale - door de fabrikant geheimgehouden - waarde bevatten.