перемиканні між реальному режимі і в захищеному режимі процесора x86

E

eelinker

Guest
Мені потрібна допомога з програмування Керівництво для перемикання між реальному режимі і в захищеному режимі x86 процесора.

 
Eelinker Привіт!

Погляньте на цей код!Код:3.
Програма для перемикання в захищений режимdosseg

. МОДЕЛЬ МАЛОГО

.586 P

codeseg_offset екв 08H

dataseg_offset екв 10h

extraseg_offset екв 18h

stackseg_offset екв 20h;------------------------------------------------- ----------------------------

Сегмент Descriptor структура

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

segment_descriptor структур

seg_length0_15 DW 0

base_addr0_15 DW 0

base_addr16_23 DB 0

Прапори DB 0

Access 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

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

; Macro використовується для відображення ПЕ розрядні

;------------------------------------------------- ----------------------------DISP макросів

MOV Ах, 06H

MOV BL, 6

Додати AL, 30H

MOV DL, AL

INT 21h

ENDMDest dsetup макросів

MOVZX EAX, AX

SHL EAX, 4

MOV dest.base_addr0_15, AX

SHR EAX, 8

MOV dest.base_addr16_23, ах

ENDM

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

; Stack

;------------------------------------------------- ----------------------------stack16 сегмента пункт громадського USE16

Припустимо CS: code16, DS: data16

DB 100 DUP (?)stack16_end словом Label

DB 100 DUP (?)

stack16 кінцями

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

; Даних

;------------------------------------------------- ----------------------------data16 сегмента пункт громадського USE16

Припустимо CS: code16, DS: data16Msg1 БД "Перехід в захищений режим ... Почекайте, на деякий час, щоб переключитися назад $"

Msg2 БД "ПП BIT OF CRO після перемикання спина $"

global_descriptor_table fword Labelgdt_start gdt_size DW, 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)

Темп DW?

data16 кінцями;------------------------------------------------- ----------------------------

; Код починається

;------------------------------------------------- ----------------------------code16 сегмента пункт громадського USE16

Припустимо CS: code16, DS: data16

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

; Процедури, що використовується для здійснення затримки

;------------------------------------------------- ----------------------------Затримка PROC NEAR

MOV ECX, 02ffffffH

Lop: Dec ECX

JNZ Lop

Схід

Затримка ENDPstart16:

CLI; вимкнути переривання; Налаштування реальному режимі регістриMOV AX, data16

MOV DS, AX

MOV AX, stack16

MOV SS, AX

MOV SP, компенсовано stack16_end

; Set Up Up різні descriptiors pmodeMOV AX, code16

dsetup code16_des

MOV AX, data16

dsetup data16_des

MOV AX, stack16

dsetup stak16_des; Налаштування глобальної таблиці дескрипторів

Темп MOV, офсетного dummy_des

ADDR32 data16, темпMOV DWORD PTR DS: gdt_start [2], EBX; Навантаження Глобальної Descriptor Table Реєстраціяlgdt fword PTR DS: global_descriptor_table; З'являється повідомлення, перед перемиканням в захищений режимMOV DX, офсетного msg1

MOV Ах, 09H

INT 21h; Switch в захищений режим роботи, встановивши ПЕ трохи CR0MOV EAX, CR0

або AL, 1

MOV CR0, EAX

DB 0eah

DW $ 4, codeseg_offset; Налаштування pmode дескрипториMOV AX, dataseg_offset

MOV DS, AX

MOV AX, stackseg_offset

MOV SS, AX

MOV AX, extraseg_offset

MOV ES, AX

MOV FS, AX

MOV GS, AX, Додати деяку затримку в захищеному режимі

відстрочка виклику; Переключіться назад в реальний режим скидання ПЕ трохи CR0MOV EAX, CR0

і "Аль, а не 1

MOV CR0, EAX

DB 0eah

DW $ 4, code16

MOV AX, data16

MOV DS, AX

MOV ES, AX

MOV AX, stack16

MOV SS, AX

MOV SP, компенсовано stack16_end; Увімкніть переривань на місце і повернутися в DOSSTI; Печатки ПЕ трохи 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 для відображення ПЕ трохи CR0DISP

MOV AX, 4c00h

INT 21h

code16 кінцями

кінець start16

кінець
 

Welcome to EDABoard.com

Sponsor

Back
Top