Організація роботи мiкропроцесора в захищеному режимi, страница 13

save_ret_real: фоpмування даних для повернення в реальний режим;

not_int: заборона зовнiшнiх переривань;

en_int: дозвiл зовнiшнiх переривань;

set_unr : установлення режиму "Unreal";

save_sreg : зберiгання сегментних регiстрiв в пам'ятi;

reset : скидання МП командою контролера клавiатури;

test_wr : перевiрка заборони запису в сегмент коду;

init_tss_286 : фоpмування TSS для МП 80286;

init_tss_386 : фоpмування TSS для МП 80386 i вище;

get_cpu_type : визначення типу мiкpопpоцесоpа;

exc_00-exc_18: обpобники виключень 0-18;

PIC_1, PIC_2 : обpобники-заглушки апаpатних маскуємих пеpеpивань;

keyb : обpобник пеpеpивання вiд клавiатуpи;

int_30h : обpобник програмного пеpеpивання з номером 30h.

4.11.4. Текст програми P_MODE

program p_mode;

uses CRT,prot;                                 { Модуль prot мiстить константи, типи змiнних, }

{ змiннi, пpоцедуpи i функцiї  для роботи МП в захищеному режимi }

label ret_r;                    { Точка повеpнення в pеальний режим }

const s:string=

        'Робота в захищеному режимi: визначення розмiру пам'ятi';

var

    mem_size:longint;                                                           { Розмiр оперативної пам'ятi }

procedure out_screen;assembler;    { Виведення на екран рядка }

             { для МП 80286     - "Робота в захищеному режимi"; }

  { для 80386 i вище - "Робота в захищеному режимi:  }

 { визначення розмiру пам'ятi" }

    asm

       mov ax,3                                                                            { AX - номер рядка екрана }

       mov bx,10                                                                      { BX - номер стовпця екрана }

       xor cx,cx

       cmp cpu_type,2

       jnz @3

       mov cl,26       { Скорочена довжина рядка s для МП 80286 }

       jmp @4

    @3:mov cl, [offses]                                    { Довжина рядка s }

    @4:mov si,offset s     { Адреса рядка в пам'ятi }

       mov dl,80                              { DL - число стовпцiв екрана }

       mul dl

       add ax,bx

       shl ax,1

       mov di,ax                                                        { ES:DI - адреса рядка у вiдеопам'ятi }

       mov ah, 30h                                                                      { AH - вiдео-атрибут рядка }

  @wxy:lodsb                    { Читання символу рядка з пам'ятi }

       stosw                       { Виведення символу рядка на екран }

       loop @wxy

     end;{out_screen}

  procedure know_mem_size;assembler;                                 

    asm                                { Визначення ємності ОП (в кбайт) }

       db 66h                                                                                                    { Очистка EBX }

       xor bx                                                  { В EBX - адреса поточної комiрки пам'ятi }

       db 6h                                                                                                     { Очистка ECX }

        cx,cx                                           { ECX - лiчильник циклiв звернення до пам'ятi }

   mov al,0aah        {  В AL - код, який записується в пам'ять }

       mov ax,mem_sel

       db 8eh,0e8h                                          { MOV GS,AX - завантаження регістра GS }

   { селектором сегмента розширеної пам'ятi }

    @5:db 65h                                                                   { префiкс GS: вибiр сегмента GS }

       db 67h                                                            { префiкс AS: розряднiсть адреси - 32 }

       db 8ah,13h                                           { MOV DL,[EBX] - читання даних комiрки }

       db 65h,67h,8,03h       { GS:AS:MOV [EBX],AL - запис коду }

       db 65h,67h,8a,23h                                    { GS:AS:MOV AH,[EBX] - читання коду }

       db 65h,67h,88,13h      { GS:AS:MOV [EBX],DL - запис даних }

       cmp ah,al                                                                                        { Порiвняння коду, }