ВУЗ:
Составители:
52
ENDP Initialization
; Область сохранения значений сегментных регистров
Save_SP DW ?
Save_SS DW ?
Save_DS DW ?
; Указатель на GDT
GDTPtr DQ ?
; Таблица дескрипторов сегментов для
; входа в защищенный режим
GDT DW 00000h,00000h,00000h,00000h ;не используется
DW 0FFFFh,00000h,09A00h,00000h ;сегмент кода CS
DW 0FFFFh,00000h,09200h,00000h ;сегмент данных DS
DW 0FFFFh,00000h,09200h,0008Fh ;сегмент GS
; Локальный стек для защищенного режима
; (организован внутри кодового сегмента)
label GDTEnd word
DB 255 DUP(0FFh)
Local_Stk_Top DB (0FFh)
;*********************************************
;* ОТМЕНИТЬ ПРЕДЕЛ СЕГМЕНТА GS *
;* Процедура изменяет содержимое теневого *
;* регистра GS таким образом, что становится *
;* возможной линейная адресация через него *
;* 4 Gb памяти в реальном режиме *
;*********************************************
PROC SetLAddrModeForGS near
; Вычислить линейный адрес кодового сегмента
mov AX,CS
movzx EAX,AX
shl EAX,4 ;умножить номер параграфа на 16
mov EBX,EAX ;сохранить линейный адрес в EBX
; Занести младшее слово линейного адреса в дескрипторы
; сегментов кода и данных
mov [word ptr CS:GDT+10],AX
mov [word ptr CS:GDT+18],AX
; Переставить местами старшее и младшее слова
ror EAX,16
; Занести биты 16-23 линейного адреса в дескрипторы
; сегментов кода и данных
mov [byte ptr CS:GDT+12],AL
mov [byte ptr CS:GDT+20],AL
; Установить предел (Limit) и базу (Base) для GDTR
lea ax,[GDT] ;*************
movzx eax,ax ;*************
add EBX,EAX; offset GDT
mov [word ptr CS:GDTPtr],(offset GDTEnd-GDT-1)
mov [dword ptr CS:GDTPtr+2],EBX
ENDP Initialization
; Область сохранения значений сегментных регистров
Save_SP DW ?
Save_SS DW ?
Save_DS DW ?
; Указатель на GDT
GDTPtr DQ ?
; Таблица дескрипторов сегментов для
; входа в защищенный режим
GDT DW 00000h,00000h,00000h,00000h ;не используется
DW 0FFFFh,00000h,09A00h,00000h ;сегмент кода CS
DW 0FFFFh,00000h,09200h,00000h ;сегмент данных DS
DW 0FFFFh,00000h,09200h,0008Fh ;сегмент GS
; Локальный стек для защищенного режима
; (организован внутри кодового сегмента)
label GDTEnd word
DB 255 DUP(0FFh)
Local_Stk_Top DB (0FFh)
;*********************************************
;* ОТМЕНИТЬ ПРЕДЕЛ СЕГМЕНТА GS *
;* Процедура изменяет содержимое теневого *
;* регистра GS таким образом, что становится *
;* возможной линейная адресация через него *
;* 4 Gb памяти в реальном режиме *
;*********************************************
PROC SetLAddrModeForGS near
; Вычислить линейный адрес кодового сегмента
mov AX,CS
movzx EAX,AX
shl EAX,4 ;умножить номер параграфа на 16
mov EBX,EAX ;сохранить линейный адрес в EBX
; Занести младшее слово линейного адреса в дескрипторы
; сегментов кода и данных
mov [word ptr CS:GDT+10],AX
mov [word ptr CS:GDT+18],AX
; Переставить местами старшее и младшее слова
ror EAX,16
; Занести биты 16-23 линейного адреса в дескрипторы
; сегментов кода и данных
mov [byte ptr CS:GDT+12],AL
mov [byte ptr CS:GDT+20],AL
; Установить предел (Limit) и базу (Base) для GDTR
lea ax,[GDT] ;*************
movzx eax,ax ;*************
add EBX,EAX; offset GDT
mov [word ptr CS:GDTPtr],(offset GDTEnd-GDT-1)
mov [dword ptr CS:GDTPtr+2],EBX
52
Страницы
- « первая
- ‹ предыдущая
- …
- 50
- 51
- 52
- 53
- 54
- …
- следующая ›
- последняя »
