code segment
p486
org 100h ; ???
assume cs:code, ds:code
start: jmp begin
mess db ' МЫ В ЗAЩИЩЕННОМ РЕЖИМЕ '
;дескриптор 0
gdt dd 0 ; дескриптор 0 ( всегда 0)
dd 0 ; дескриптор 0 ( всегда 0)
;дескриптор 1
dw 0ffffh ; предел
dw 8000h ; база (15..0)
db 0bh ; уровень привилегий, тип
dw 0 ; сегмент, добавляемый к базе
;дескриптор 2
desc_gdt dq 0 ;
begin:
mov si,offset desc_gdt ; в si смещение дескриптора 2
mov word ptr [si],15 ; предел дескриптора 2
mov ebx, 0
mov bx,offset gdt
push cs
mov eax,0
pop ax
shl eax,4
add ebx,eax
mov [si+2],ebx ; а это адрес
lgdt pword ptr [si] ; а теперь перекидываем заготовку в GDTR
mov eax,cr0
mov edx,eax
cli
or eax,1
mov cr0,eax ; ???? тут типа идет загрузка значения 1 в бит PE
mov ax,8 ; иначе только push/pop
mov es,ax ; заносим в ES дескриптор видеопамяти
cld
mov si,0 ; чистим экран
mov ax,7020h ; цвет/код
mov cx,2000 ; 80 x 25
rep stosw ; заполнение ES:[EDI] = EAX, счетчик в ECX
mov bx,offset mess ; выводим надпись
mov si,1010 ;
mov cx,22 ;
m:
mov al,[bx]
mov es:[si],al
add si,2
inc bx
loop m
mov cr0,edx ; выходим обратно в реальный режим
sti
mov si,1348 ; этот фрагмент доказывает что МП
mov di,offset gdt ; использует в РР начальный адрес
mov al,[di+13] ; из теневой части сегментного регистра,
and al,0fh ; а не из видимой ( в видимой части ES - 8, а значение
add al,30h ; выводится в видеопамять!!) и также показывает, что
mov es:[si],al ; МП сам устонавливает бит А в дескрипторе (было
; 92,стало 93 (на экран выводит-ся 3))
mov ah,7
int 21h
mov ah,4ch
int 21h
code ends
end start
Мне кажется код нерабочий...