Системное программное обеспечение. Особенности программирования 32-разрядных процессоров. Рощин А.В. - 52 стр.

UptoLike

Составители: 

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