LOADALL

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

LOADALL is een ongedocumenteerde instructie van sommige microprocessors van Intel.

LOADALL kan met één instructie alle registers van de processor laden. Interessant is daarbij dat ook de segmentdescriptors worden geladen, 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]

De machinecode op de 80286 is 0F05. De instructie laadt gegevens van adres 00800-00866, ongeacht de inhoud van de segmentregisters. Helaas 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 register
00800 niet gebruikt MSW, machine status word
00808 niet gebruikt
00810 niet gebruikt TR, task register
00818 flags IP, instruction pointer LDTR, local descriptor table register DS data segment
00820 SS stack segment CS code segment ES extra segment DI destination index
00828 SI source index BP byte pointer SP stack pointer BX
00830 DX CX AX ES segmentdescriptor>>>
00838 <<<ES segmentdescriptor CS segmentdescriptor>>>
00840 <<<CS segmentdescriptor SS segmentdescriptor
00848 DS segmentdescriptor GDT, global descriptor table>>>
00850 <<<GDT, global descriptor table LDT, local descriptor table>>>
00858 <<<LDT, local descriptor table IDT, interrupt descriptor table
00860 TSS, task state segment

80386[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 aantal bytes register register register register
ES:EDI+00 3x4 CR0, control register 0 EFLAGS EIP, instruction pointer  
ES:EDI+0C 4x4 EDI, destination index ESI, source index EBP, byte pointer ESP, stack pointer
ES:EDI+1C 4x4 EBX EDX ECX EAX
ES:EDI+2C 2x4 DR6 DR7  
ES:EDI+34 2x4 TR, task state selector LDTR, local descriptor table
ES:EDI+3C 4x2 GS, extra segment niet gebruikt FS, extra segment niet gebruikt
ES:EDI+44 4x2 DS, data segment niet gebruikt SS, stack segment niet gebruikt
ES:EDI+4C 4x2 CS, code segment niet gebruikt ES, extra segment niet gebruikt
ES:EDI+54 4x12 TSS descriptor, task state selector IDT descriptor, interrupt descriptor table GDT descriptor, global descriptor table LDT descriptor, local descriptor table
ES:EDI+84 4x12 GS segmentdescriptor FS segmentdescriptor DS segmentdescriptor SS segmentdescriptor
ES:EDI+B4 2x12 CS segmentdescriptor ES segmentdescriptor  

Andere processors[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 als ongeldige instructie tenzij de registers een speciale - door de fabrikant geheimgehouden - waarde bevatten.