превключване между реален режим и в защитен режим x86 CPU's

E

eelinker

Guest
Имам нужда от помощ за програмиране ръководство за превключване между реален режим и в защитен режим x86 процесори.

 
Здравейте eelinker!

Обърнете внимание на този код!Код:3.
Програма за да преминете към защитен режимdosseg

. ОБРАЗЕЦ НА МАЛКИТЕ

.586 П

codeseg_offset EQU 08h

dataseg_offset EQU 10h

extraseg_offset EQU 18h

stackseg_offset EQU 20h;------------------------------------------------- ----------------------------

; Секция Descriptor Структура

;------------------------------------------------- ----------------------------

segment_descriptor струк

seg_length0_15 DW 0

base_addr0_15 DW 0

base_addr16_23 db 0

знамена db 0

достъп db 0

base_addr24_31 db 0

segment_descriptor завършва;------------------------------------------------- ----------------------------

; Макро използва за 32-битови изчисления адрес

;------------------------------------------------- ----------------------------ADDR32 макро база, offsetadd

MOV EAX, 0

MOV EBX, EAX

MOV AX, база

SHL EAX, 4

MOV BX, offsetadd

добави EBX, EAX

endm

;------------------------------------------------- ----------------------------

; Макро, използвани за показване на PE малко

;------------------------------------------------- ----------------------------DISP макро

MOV ах, 06Н

MOV бл, 6

добави Ал, 30H

MOV DL, Al

Int 21h

endmDEST dsetup макро

movzx EAX, ах

SHL EAX, 4

MOV dest.base_addr0_15, ах

Специализирани болници за рехабилитация EAX, 8

MOV dest.base_addr16_23, ах

endm

;------------------------------------------------- ----------------------------

; Stack

;------------------------------------------------- ----------------------------stack16 сегмент ал обществени use16

поеме CS: code16, DS: data16

100 db DUP (?)stack16_end етикет дума

100 db DUP (?)

stack16 завършва

;------------------------------------------------- ----------------------------

; Данни

;------------------------------------------------- ----------------------------data16 сегмент ал обществени use16

поеме CS: code16, DS: data16MSG1 DB "Преминаване към защитен режим ... Чакай за някой да се върнете обратно $"

MSG2 DB "PE малко CRO след смяната гърба е $"

global_descriptor_table етикет fwordgdt_start DW gdt_size, 0,0

dummy_des segment_descriptor <0,0,0,0,0,0>

code16_des segment_descriptor <0ffffh, 0,0,9 ах, 0,0>

data16_des segment_descriptor <0ffffh, 0,0,92 ч, 0,0>

extraseg_des segment_descriptor <0ffffh, 0,0,92 ч, 0,0>

stak16_des segment_descriptor <00000h, 0,0,96 ч, 0,0>

gdt_size = $ - (офсет dummy_des)

Temp DW?

data16 завършва;------------------------------------------------- ----------------------------

; Кодът започва

;------------------------------------------------- ----------------------------code16 сегмент ал обществени use16

поеме CS: code16, DS: data16

;------------------------------------------------- ----------------------------

; Процедура, използвана за прилагане на забавяне

;------------------------------------------------- ----------------------------забавяне PROC КРАЙ

MOV ECX, 02ffffffH

мъкна: Декември ECX

jnz увисвам

Ret

забавяне endpstart16:

CLI; изключите прекъсват; Създаване на недвижими регистри режимMOV AX, data16

MOV DS, ах

MOV AX, stack16

MOV СС, ах

MOV SP, офсетов stack16_end

; Създаване на различните descriptiors PModeMOV AX, code16

dsetup code16_des

MOV AX, data16

dsetup data16_des

MOV AX, stack16

dsetup stak16_des; Създаване на глобалната таблица ЕВРОВОК

MOV Temp, офсетов dummy_des

ADDR32 data16, TempMOV DWORD PTR DS: gdt_start [2], EBX; Заредете Global Descriptor Таблица Регистрацияlgdt fword PTR DS: global_descriptor_table; Покаже съобщение, преди да преминете към защитен режимMOV DX, офсетов MSG1

MOV ах, 09H

Int 21h; Превключи на защитеният режим чрез създаването PE малко CR0MOV EAX, cr0

или ал, 1

MOV cr0, EAX

db 0eah

DW $ 4, codeseg_offset; Създаване на PMode дескрипториMOV AX, dataseg_offset

MOV DS, ах

MOV AX, stackseg_offset

MOV СС, ах

MOV AX, extraseg_offset

MOV ES, AX

MOV FS, ах

MOV GS, ах; Да доведе до забавяне в защитен режим

повикване забавяне; Върнете обратно към реален режим на възстановяване PE малко CR0MOV EAX, cr0

и др, не 1

MOV cr0, EAX

db 0eah

DW $ 4, code16

MOV AX, data16

MOV DS, ах

MOV ES, AX

MOV AX, stack16

MOV СС, ах

MOV SP, офсетов stack16_end; Включете прекъсва отново и се върна към DOSSTI; Печат на PE малко CR0MOV DL, 0AH

MOV ах, 02h

Int 21h

MOV DL, 0DH

MOV ах, 02h

Int 21h

MOV DX, офсетов MSG2

MOV ах, 09H

Int 21h

MOV EAX, cr0

и др, 0001H, Използване на макро DISP да покажете PE малко CR0DISP

MOV AX, 4c00h

Int 21h

code16 завършва

края start16

приключвам
 

Welcome to EDABoard.com

Sponsor

Back
Top