alternar entre o modo real e modo protegido de 86 CPU's

E

eelinker

Guest
Eu preciso de ajuda para o guia de programação para alternar entre o modo real e modo protegido de 86 CPU's.

 
Eelinker Hi!

Dê uma olhada neste código!Código:3.
Programa para mudar para o modo protegidodosseg

. MODEL SMALL

.586 P

equ codeseg_offset 08h

equ dataseg_offset 10h

equ extraseg_offset 18h

equ stackseg_offset 20h;------------------------------------------------- ----------------------------

; Segment Descriptor Estrutura

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

estrutura segment_descriptor

seg_length0_15 dw 0

base_addr0_15 dw 0

base_addr16_23 db 0

bandeiras db 0

db acesso 0

base_addr24_31 db 0

termina segment_descriptor;------------------------------------------------- ----------------------------

; Macro utilizado para cálculo de endereço 32-bit

;------------------------------------------------- ----------------------------ADDR32 base macro, offsetadd

mov eax, 0

mov ebx, eax

mov ax, base

shl eax, 4

mov bx, offsetadd

add ebx, eax

endm

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

; Macro usado para exibir pouco PE

;------------------------------------------------- ----------------------------Macro DISP

mov ah, 06H

mov bl, 6

add al, 30h

mov dl, al

int 21h

endmdest macro dsetup

eax movzx, ax

shl eax, 4

mov dest.base_addr0_15, ax

shr eax, 8

mov dest.base_addr16_23, ah

endm

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

; Stack

;------------------------------------------------- ----------------------------stack16 para segmento público USE16

assume cs: code16, ds: data16

db 100 dup (?)palavra rótulo stack16_end

db 100 dup (?)

stack16 termina

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

; Dados

;------------------------------------------------- ----------------------------data16 para segmento público USE16

assume cs: code16, ds: data16Db MSG1 "Alternar para o modo protegido ... Espere por algum tempo para voltar $"

Db MSG2 "PE POUCO DE CRO após a mudança de volta é de R $"

fword rótulo global_descriptor_tablegdt_size dw gdt_start, 0,0

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

code16_des segment_descriptor <0FFFFh, 0,0,9 ah, 0,0>

data16_des segment_descriptor <0FFFFh, 0,0,92 h, 0,0>

extraseg_des segment_descriptor <0FFFFh, 0,0,92 h, 0,0>

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

gdt_size = $ - (offset dummy_des)

temp dw?

data16 termina;------------------------------------------------- ----------------------------

; Código começa

;------------------------------------------------- ----------------------------code16 para segmento público USE16

assume cs: code16, ds: data16

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

; Processo usado para implementar atraso

;------------------------------------------------- ----------------------------atraso PROC NEAR

mov ecx, 02ffffffH

LOP: dec ecx

lop jnz

ret

ENDP atrasostart16:

cli; desativar as interrupções; Criação de registos de modo realmov ax, data16

mov ds, ax

mov ax, stack16

mov ss, ax

mov sp, offset stack16_end

; Configurar o descriptiors pmode diversosmov ax, code16

code16_des dsetup

mov ax, data16

data16_des dsetup

mov ax, stack16

stak16_des dsetup; Criar a tabela de descritores globais

mov temp, offset dummy_des

ADDR32 data16, tempmov dword ptr ds: gdt_start [2], ebx; Carga Global Descriptor Table RegisterLGDT fword ptr ds: global_descriptor_table; Exibir uma mensagem antes de mudar para Modo Protegidomov dx, offset MSG1

mov ah, 09H

int 21h; Alternar para o modo protegido pela configuração de bits PE CR0mov eax, cr0

ou 1 al,

mov cr0, eax

db 0eah

dw $ 4, codeseg_offset; Configurar os descritores pmodemov 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, Dá um certo atraso em modo protegido

atraso chamada; Alternar para o modo real, redefinindo bit PE do CR0mov eax, cr0

e 1 al, não

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, offset stack16_end; Turn interrompe novamente e voltar ao DOSsti; Imprimir o bit PE do CR0mov dl, 0AH

mov ah, 02H

int 21h

mov dl, 0DH

mov ah, 02H

int 21h

mov dx, offset MSG2

mov ah, 09H

int 21h

mov eax, cr0

e 0001H al,; DISP Use a macro para mostrar bit PE do CR0disp

mov ax, 4c00h

int 21h

code16 termina

final start16

fim
 

Welcome to EDABoard.com

Sponsor

Back
Top