Цель работы:
Изучить средства для работы в защищённом режиме.
Текст задания:
Написать обработчик особой ситуации 11 (сегмент не присутствует), выводящий соответствующее сообщение на экран. Для проверки его работы создать в LDT дескриптор неприсутствующего сегмента и обратиться к нему. Использовать функции DPMI.
Общая схема решения задачи:
С помощью функции 0203h установить обработчик особой ситуации 11. Затем функцией 0000h создать дескриптор и функцией 0009h установить бит присутствия в 0. После этого при загрузке в сегментный регистр селектора этого дескриптора должна генерироваться особая ситуация 11. В процедура обработки особой ситуации 11 осуществить вывод на экран соответствующего сообщения.
Текст программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
; .386 Regs Struc ; Шаблон управляющей _EDI dd 0 ; структуры для вызова _ESI dd 0 ; прерывания или процедуры _EBP dd 0 ; реального режима dd 0 _EBX dd 0 _EDX dd 0 _ECX dd 0 _EAX dd 0 _FLAGS dw 0 ; _ES dw 0 _DS dw 0 _FS dw 0 _GS dw 0 _IP dw 0 _CS dw 0 _SP dw 0 _SS dw 0 Ends Dseg Segment Para Use16 Public 'Data' ; Сегмент данных PMode_Offset dw ? ; Адрес процедуры перехода PMode_Segment dw ? ; в защищенный режим Mess db 'Protected Mode with' db ' DPMI.$' no_segment_message db '<<ERROR 11>>$' Ar1 Regs <> ; Управляющая структура Video dw ? ; Селектор дескриптора ; видеобуфера MYSELECTOR dw ? ;Селектор с битом присутствия =0 Dseg Ends Sseg Segment Para Use16 Stack 'Stack' ; Сегмент стека dw 100 dup (0) Sseg Ends Cseg Segment Use16 Para Public 'Code' ; Кодовый сегмент Assume cs:Cseg,ds:Dseg,es:Sseg Begin Proc Far push ds xor ax,ax push ax mov ax,dseg mov ds,ax ; DS - сегмент данных mov ax, 1687h ; Получаем адрес проце- int 2Fh ; дуры переключения в ; защищенный режим test ax, ax ; Если DPMI не установ- jnz Error ; лен, то выход ; mov [PMode_Segment],es ; Сохраняем полученный mov [PMode_Offset],di ; адрес процедуры test si, si ; Нужна память серверу ? jz Switch ; Нет - переходим на пе- ; реключение режима mov bx, si ; Да - запрашиваем блок xor ax,ax ; памяти DOS mov ah, 48h int 21h jc Error ; Выход, если нет памяти mov es, ax ; Адрес полученного блока Switch: xor ax, ax ; AX=0 (16битная программа) call dword ptr [PMode_Offset] ; Переключиться в ; защищенный режим jc Error ; Выход, если ошибка ; Работа в защищенном режиме mov ax,0000h ; Создать один дескриптор mov cx,1 ; в LDT этой задачи int 31h mov Video,ax ; Сохранить его селектор mov cx,000bh ; Установить базовый адрес mov dx,8000h ; сегмента видеопамяти в mov bx,Video ; созданном дескрипторе mov ax,0007h int 31h jc Error ; Выход, если ошибка xor cx,cx ; Установить предел mov dx,1000h ; сегмента видеопамяти mov bx,Video ; в созданном дескрипторе mov ax,0008h int 31h jc Error ; Выход, если ошибка mov ax,0009h ; Установить права доступа mov bx,Video ; сегмента mov cx,0000000011110010b int 31h ; jc Error ; Выход, если ошибка mov es,Video ; Селектор сегмента mov cx,2000 ; Количество повторений mov ax,0f20h ; Символ с атрибутом xor di,di ; Начальное смещение rep stosw ; Заполнить область памяти push ds pop es ; ES := DS ;Здесь далее устанавливается обработчик особой ситуации 11 (сегмент не присутствует) mov ax,0203h; mov bl,11; mov cx,cs; mov dx,offset int_11; int 31h; jc Error; ;Теперь создаём в LDT дескриптор mov ax,0000h; mov cx,1; int 31h; jc Error; mov MYSELECTOR,ax; mov cx,000bh ; Установить базовый адрес mov dx,8000h ; сегмента видеопамяти в mov bx,MYSELECTOR ; созданном дескрипторе mov ax,0007h int 31h jc Error ; Выход, если ошибка xor cx,cx ; Установить предел mov dx,1000h ; сегмента видеопамяти mov ax,0008h mov bx,MYSELECTOR; int 31h jc Error ; Выход, если ошибка ;Записываем байт прав доступа mov ax,0009h; mov cx,0000000001110010b; ;Бит обращения=0 ;TYPE=001 сегмент данных (разрешено чтение и запись) ;Тип сегмента =1 (прикладной) ;Уровень привилегированности =11 ;бит присутствия=0 (отсутствует) mov bx,MYSELECTOR int 31h jc Error; ;Теперь при загрузке в сегментный регистр созданного селектора должна произойти особая ситуация 11 mov ax,MYSELECTOR; mov es,ax; push ds; pop es; ; Установка координат курсора mov word ptr Ar1._EAX,0200h ; AH := 02h mov word ptr Ar1._EBX,0000h ; BX := 0000h mov word ptr Ar1._EDX,050Ah ; DX := 050Ah xor cx,cx ; Количество параметров mov bx,0010h ; Номер прерывания lea di,Ar1 ; Адрес структуры mov ax,0300h ; Функция DPMI int 31h ; Вызов прерывания ; реального режима jc Error ; Выход, если ошибка ; Вывод строки посимвольно на экран lea si,Mess ; Адрес строки Next_Char: lodsb ; Считать символ cmp al,'$' ; Символ конца строки ? jz Ex ; Да - конец вывода mov ah,0eh ; Номер функции INT 10h mov word ptr Ar1._EAX,ax lea di,Ar1 ; Адрес структуры mov bx,0010h ; Номер прерывания xor cx,cx ; Количество параметров mov ax,0300h ; Функция DPMI int 31h ; Вызов прерывания ре- ; ального режима jmp short Next_Char ; Перейти к следующему ; символу Ex: mov ax, 4C00h ; Выход с кодом ошибки 0 int 21h Error: mov ax, 4C01h ; Выход с кодом ошибки 1 int 21h Begin Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Обработчик особой ситуации 11 (сегмент не присутствует) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; int_11 proc near mov es,Video ; Селектор сегмента mov cx,2000 ; Количество повторений mov ax,0F20h ; Символ с атрибутом xor di,di ; Начальное смещение rep stosw ; Заполнить область памяти push ds pop es ; ES := DS ; Установка координат курсора mov word ptr Ar1._EAX,0200h ; AH := 02h mov word ptr Ar1._EBX,0000h ; BX := 0000h mov word ptr Ar1._EDX,050Ah ; DX := 050Ah xor cx,cx ; Количество параметров mov bx,0010h ; Номер прерывания lea di,Ar1 ; Адрес структуры mov ax,0300h ; Функция DPMI int 31h ; Вызов прерывания ; реального режима jc Error ; Выход, если ошибка ; Вывод строки посимвольно на экран lea si,no_segment_message ; Адрес строки int_11_Next_Char: lodsb ; Считать символ cmp al,'$' ; Символ конца строки ? jz Ex ; Да - конец вывода mov ah,0eh ; Номер функции INT 10h mov word ptr Ar1._EAX,ax lea di,Ar1 ; Адрес структуры mov bx,0010h ; Номер прерывания xor cx,cx ; Количество параметров mov ax,0300h ; Функция DPMI int 31h ; Вызов прерывания ре- ; ального режима jmp short int_11_Next_Char ; Перейти к следующему ; символу mov ax, 4C01h ; Выход с кодом ошибки 1 int 21h int_11 endp Cseg Ends End Begin |