Защищенный режим процессоров Intel


Программа, которая работает с прерываниями - часть 5


wrong1 db ? continue: ; После нажатия на клавишу <ESC> выходим в это место ; программы. Следующие несколько строк демонстрируют ; команды, которые вызывают исключение. Вы можете ; попробовать их, если уберёте символ комментария ; из соответствующей строки. ; Попытка записи за конец сегмента данных. Метка wrong ; находится в самом конце программы. mov [wrong], al ; Попытка записи в сегмент кода. ; mov [wrong1], al ; Попытка извлечения из пустого стека. ; pop ax ; Загрузка в сегментный регистр неправильного селектора. ; mov ax, 1280h ; mov ds, ax ; Прямой вызов исключения при помощи команды прерывания. ; int 1 call set_rmode ; установка реального режима mov bh, 07h ; стираем экран и call clrscr ; выходим в DOS mov ah,4c int 21h ENDP start MACRO setgdtentry mov [(desc_struc bx).base_l],ax mov [(desc_struc bx).base_h],dl ENDM ; ------------------------------------------- ; Установка защищённого режима ; ------------------------------------------- PROC set_pmode NEAR mov ax,DGROUP mov dl,ah shr dl,4 shl ax,4 mov si,ax mov di,dx add ax,OFFSET gdtr adc dl,0 mov bx,OFFSET gdt_gdt setgdtentry ; Заполняем дескриптор в GDT, указывающий на ; дескрипторную таблицу прерываний mov ax,si ; загружаем 24-битовый адрес сегмента mov dx,di ; данных add ax,OFFSET idt ; адрес дескриптора для IDT adc dl,0 mov bx,OFFSET gdt_idt setgdtentry ; Заполняем структуру для загрузки регистра IDTR mov bx,OFFSET idtr mov [(idtr_struc bx).idt_l],ax mov [(idtr_struc bx).idt_h],dl mov bx,OFFSET gdt_ds mov ax,si mov dx,di setgdtentry mov bx,OFFSET gdt_cs mov ax,cs mov dl,ah shr dl,4 shl ax,4 setgdtentry mov bx,OFFSET gdt_ss mov ax,ss mov dl,ah shr dl,4 shl ax,4 setgdtentry ; готовим возврат в реальный режим push ds mov ax,40 mov ds,ax mov [WORD 67],OFFSET shutdown_return mov [WORD 69],cs pop ds cli mov al,8f out CMOS_PORT,al jmp del1 del1: mov al,5 out CMOS_PORT+1,al mov ax,[rl_crt] ; сегмент видеопамяти mov es,ax call enable_a20 ; открываем линию A20 mov [real_ss],ss ; сохраняем сегментные mov [real_es],es ; регистры ; -------- Перепрограммируем контроллер прерываний -------- ; Устанавливаем для IRQ0-IRQ7 номера прерываний 20h-27h mov dx,MASTER8259A mov ah,20h call set_int_ctrlr ; Устанавливаем для IRQ8-IRQ15 номера прерываний 28h-2Fh mov dx,SLAVE8259A mov ah,28h call set_int_ctrlr ; Загружаем регистры IDTR и GDTR lidt [FWORD idtr] lgdt [QWORD gdt_gdt] ; Переключаемся в защищённый режим mov ax,VIRTUAL_MODE lmsw ax ; jmp far flush db 0ea dw OFFSET flush dw CS_DESCR LABEL flush FAR ; Загружаем селекторы в сегментные регистры mov ax,SS_DESCR mov ss,ax mov ax,DS_DESCR mov ds,ax ; Разрешаем прерывания sti ret ENDP set_pmode ; -------------------------------- ; Возврат в реальный режим ; -------------------------------- DATASEG ; Пустой дескриптор для выполнения возврата ; процессора в реальный режим через перевод ; его в состояние отключения.


Начало  Назад  Вперед