ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »