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

UptoLike

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

20
36 mes db 27,'[31;42mReal mode now',27,’[0m’,10,13,'$'
37 mes1 db 26 dup(32),'A message in protected mode',27 dup(32),0
38 data_size=$-gdt_null ; Размер сегмента данных
39 data ends
40 ;=========================================================
41 text segment 'code' use16 ; По умолчанию 16-разрядный режим
42 assume cs:text,ds:data
43 main proc
44 xor eax,eax ; Очистка 32-разр. EAX
45 mov ax,data ; Инициализация сегментного регистра
46 mov ds,ax ; для реального режима
47 ; Вычисление 32-битного линейного адреса сегмента данных и загрузка
48 ; его в дескриптор (в EAX уже находится его сегментный адрес).
49 ; Для умножения его на 16 сдвинем его влево на 4 разряда
50 shl eax,4 ; В ЕAX - линейный базовый адрес
51 mov ebp,eax ; Сохранение его в EBP
52 mov bx,offset gdt_data ; В ВХ адрес дескриптора
53 mov [bx].base_1,ax ; Мл. часть базы
54 rol eax,16 ; Обмен старшей и младшей половины EAX
55 mov [bx].base_m,al ; Средняя часть базы
56 ;Вычисление и загрузка 32-битного линейного адреса сегмента команд
57 xor eax,eax ; Очистка 32-разр. EAX
58 mov ax,cs ; Адрес сегмента команд
59 shl eax,4 ; В ЕAX - линейный базовый адрес
60 mov bx,offset gdt_code ; В ВХ адрес дескриптора
61 mov [bx].base_1,ax ; Мл. часть базы
62 rol eax,16 ; Обмен старшей и младшей половины EAX
63 mov [bx].base_m,al ; Средняя часть базы
64 ;Вычисление и загрузка 32-битного линейного адреса сегмента стека
65 xor eax,eax
66 mov ax,ss
67 shl eax,4
68 mov bx,offset gdt_stack
69 mov [bx].base_1,ax
70 rol eax,16
71 mov [bx].base_m,al
72 ;Подготовка псевдодескриптора и загрузка его в регистр GDTR
73 mov dword ptr pdescr+2,ebp ; База GDT (0-31)
74 mov word ptr pdescr,gdt_size-1 ; Граница GDT
75 lgdt pdescr ; Загрузка регистра GDTR
76 ;Подготовка к переходу в защищенный режим
77 cli ; Запрет маскир. прерываний
78 mov al,80h ; Запрет NMI
79 out 70h,al ; Порт КМОП микросхемы
80 ;Переход в защищенный режим
81 mov eax,cr0 ; Чтение регистра состояния
82 or eax,1 ; Взведение бита 0
83 mov cr0,eax
84 ;*************************************************
85 ;* Теперь процессор работает в защищенным режиме *
86 ;*************************************************
36   mes      db     27,'[31;42mReal mode now',27,’[0m’,10,13,'$'
37   mes1     db     26 dup(32),'A message in protected mode',27 dup(32),0
38   data_size=$-gdt_null        ; Размер сегмента данных
39   data     ends
40   ;=========================================================
41   text     segment      'code' use16 ; По умолчанию 16-разрядный режим
42            assume     cs:text,ds:data
43   main     proc
44        xor eax,eax ; Очистка 32-разр. EAX
45        mov ax,data ; Инициализация сегментного регистра
46        mov ds,ax     ; для реального режима
47   ; Вычисление 32-битного линейного адреса сегмента данных и загрузка
48   ; его в дескриптор (в EAX уже находится его сегментный адрес).
49   ; Для умножения его на 16 сдвинем его влево на 4 разряда
50        shl eax,4        ; В ЕAX - линейный базовый адрес
51        mov ebp,eax      ; Сохранение его в EBP
52        mov bx,offset gdt_data       ; В ВХ адрес дескриптора
53        mov [bx].base_1,ax     ; Мл. часть базы
54        rol eax,16       ; Обмен старшей и младшей половины EAX
55        mov [bx].base_m,al     ; Средняя часть базы
56   ;Вычисление и загрузка 32-битного линейного адреса сегмента команд
57        xor eax,eax      ; Очистка 32-разр. EAX
58        mov ax,cs        ; Адрес сегмента команд
59        shl eax,4        ; В ЕAX - линейный базовый адрес
60        mov bx,offset gdt_code       ; В ВХ адрес дескриптора
61        mov [bx].base_1,ax     ; Мл. часть базы
62        rol eax,16       ; Обмен старшей и младшей половины EAX
63        mov [bx].base_m,al     ; Средняя часть базы
64   ;Вычисление и загрузка 32-битного линейного адреса сегмента стека
65        xor eax,eax
66        mov ax,ss
67        shl eax,4
68        mov bx,offset gdt_stack
69        mov [bx].base_1,ax
70        rol eax,16
71        mov [bx].base_m,al
72   ;Подготовка псевдодескриптора и загрузка его в регистр GDTR
73        mov dword ptr pdescr+2,ebp         ; База GDT (0-31)
74        mov word ptr pdescr,gdt_size-1 ; Граница GDT
75        lgdt     pdescr                    ; Загрузка регистра GDTR
76   ;Подготовка к переходу в защищенный режим
77        cli              ; Запрет маскир. прерываний
78        mov al,80h       ; Запрет NMI
79        out 70h,al       ; Порт КМОП микросхемы
80   ;Переход в защищенный режим
81        mov eax,cr0 ; Чтение регистра состояния
82        or eax,1      ; Взведение бита 0
83        mov cr0,eax
84   ;*************************************************
85   ;* Теперь процессор работает в защищенным режиме *
86   ;*************************************************


                                         20