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.

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

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.