Програма модифікуюча команди, які використовуються в захищеному режимі - Курсовая работа

бесплатно 0
4.5 132
Програма, що модифікує деякі команди для того, щоб вони могли працювати в захищеному режимі роботи мікропроцесора. Вимоги до надійності, маркування і пакування. Умови експлуатації. Стадії і етапи розробки програми. Опис і розробка алгоритму рішення.

Скачать работу Скачать уникальную работу

Чтобы скачать работу, Вы должны пройти проверку:


Аннотация к работе
Програмний виріб це програма, що модифікує деякі команди, для того, щоб вони могли працювати в захищеному режимі. Програмний виріб орієнтований на компютери серії ІВМ PS сумісних ПЭВМ, що використовують мікропроцесори 80286, 80386 і 80486. Програмний виріб повинний забезпечувати, модифікацію команд для того, щоб вони могли працювати в захищеному режимі роботи мікропроцесора. Вимоги до надійності : Програмний виріб повинний стійко функціонувати в апаратному і програмному середовищі, обговореному в п.4 Умови експлуатації : Умови експлуатації програмного виробу цілком визначаються умовами експлуатації застосованих технічних засобів і носіїв даних.Чи виконується ця команда на даному мікропроцесорі можна визначити за допомогою біта ID (21) регістра EFLAGS: якщо програмно стан цього біта можна змінити, значить команда CPUID виконується. У реальному режимі для опису атрибутів сегмента дескриптор не потрібно, тому що базова адреса сегмента (зменшений у 16 разів) зберігається в сегментному регістрі, границя сегмента (64 Кб - 1) фіксована і завжди може бути зроблений доступ (запис і читання) до сегмента. Формат дескриптора сегмента для МП починаючи з 80386, що має наступні полючи : Границя сегмента, рівна розміру сегмента, зменшеному на 1, і його базову адресу займають у дескрипторі по двох полючи : границя - байти 0,1 і молодші 4 розряди байта 6, базовий адреса - байти 2-4 і 7 дескриптора сегмента. ED (Expand Down) - біт напрямку розширення визначає, як буде вказуватися границя сегмента даних: при ED=0 (расширение нагору) дані в сегменті розміщаються в напрямку зростання адрес від базової адреси сегмента до його границі, зазначеної в дескрипторі; при ED=1 (расширення униз) дані в сегменті розташовуються в напрямку зменшення адрес. Якщо сегмента, до якого виконується звертання, немає в памяті (P=0), виробляється відповідне переривання, і операційна система, обробляючи це переривання, зчитує цей сегмент із магнітного диска в память.

План
Зміст

Вступ

1. Підстава для розробки.

2. Призначення розробки.

3. Вимоги до програмного виробу.

3.1 Вимоги до функціональних характеристик.

3.2 Вимоги до надійності.

3.3 Умови експлуатації.

3.4 Вимоги до маркування і пакування.

3.5 Вимоги до транспортування і збереження.

Вимоги до складу і параметрів технічних засобів.

Вимоги до програмної документації.

Техніко-економічні показники.

Стадії і етапи розробки.

Порядок контролю і приймання.

Уведення

Список литературы
Опис змінних.

Змінна Тип Призначення

Dlina Integer Загальна довжина команди.

Cod Byte Шеснадцятирічне значення коду команди. i Byte Номер команди. p Longint Число яке перетвориться в 16-річну форму. s String Получене 16-річне значення.

Dlin_Kom Integer Довжина команди. b1 Byte Байт, що йде за кодом операції.

Md Byte Значення поля mod ( Регистровій режим / режим памяті з довжиною зсуву).

Rm Byte Значення поля R/m ( Регистр-операнд / регістри, використовувані в обчисленні зсуву ). hex_tabl Array[0..15] of char Шеснадцятирічне значення чисел.

Опис процедур і функцій.

Процедура Analiz : ( procedure Analiz;Assembler; )

У даній процедурі знаходиться код програми, написаний мовою Assembler, що аналізується, на розмір формату команди, у наслідку, головною програмою.

Функція hex : ( function hex(p:longint):string; )

Дана функція здійснює переклад числа p у шеснадцятирічне значення, для наступного виводу його на печатку, чи екран монітора.

Функція Opred_Dlin_Kom : ( function Opred_Dlin_Kom(cod:byte;n:word):integer; )

Дана функція здійснює обчислення розміру довжини байта, який йде відразу після КОП ( коду операції ).

Головна програма : ( program Ade; )

У тексті головної програми здійснює обчислення розміру довжини поточної команди, і перехід, по отриманій довжині, до коду наступної команди.

Список літератури : "Апаратне забезпечення ІВМ PC " (частина 1) Діалог - Мифи

"Програмування в середовищі Turbo Pascal 7.0" А.І Марченко Л.А. Марченко 1997р.

Методичні вказівки " Засобу обробки переривань у мові Turbo Pascal 7.0" 1993р. Ф.А. Домнін І.С.Зиков.

Методичні вказівки "Архітектура обчислювальних систем " 1993р. А.І. Поворознюк, І.С.Зиков, С.Ю. Леонов.

Методичні вказівки "Робота з машинними кодами і прямою доступ до памяті і портів у мові Turbo Pascal 7.0" 1993р. Ф.А. Домнін И.С. Зиков.

Міністерство Освіти і Науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра : “ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА ПРОГРАМУВАННЯ”

ЗАТВЕРДЖУЮ

Зав. Кафедрою О.Т.П.

___________ /xxxxxxx./

_________________ 2002р.

Програма модифікуюча команди, які використовуються в захищеному режимі

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

ЛИСТ ЗАТВЕРДЖЕННЯ

Xxxxxx- 01 12 01-1 ЛЗ

Розробники : Керівник проекту : ________ / xxxxxxxxx./

___________________ 2002р.

Виконавець : _______ / Хххххххххххх Х.Х./

___________________ 2002р.

Харків

2002

ЗАТВЕРДЖЕНИЙ

Xxxxxx- 01 12 01-1 ЛЗ

Програма модифікуюча команди, які використовуються в захищеному режимі

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

Харків

2002

program Ade; { Курсовой проект по МПС на 2002г.} uses CRT, prot; { Модуль PROT содержит константы, типы переменных, переменные, процедуры и функции для работы в защищенном режиме } label ret_r; { Точка возврата в реальный режим } const code_sel3 =$30; { селектор кода модуля TURBO } s:string="Обработка прерываний в защищенном режиме";

s1:string="Скан-коды клавиш: ";

var ff:extended;

err,segcode,ip,ofs_div,ofs_next,fl1,fl2,cur_sel,cod_ofs,cod_sel,sel_descr,ofs_analiz, ds_int,ax_,bx_,ds_,bp_,ss_,cs_,flags,sp_,w,segm,sel_cs,es_ :word;

cod_,i,lim1,lim2,prov,i_descr:byte;ss:string;dlina : integer;i_table:byte;

table:array[0..9] of record segm,ofs:word;cod,descr:byte;

end;

Real_Znach_ds : word;Real_Znach_ss : word;Real_Znach_es : word;Real_Znach_cs : word;

procedure out_GDT;{------------------Вывод таблицы GDT------------------} var i:byte;

begin i:=1;

writeln("ТАБЛИЦА GDT");

while gdt[i].acc0 do begin writeln(hex(i*8),":", hex(gdt[i].acc)," ",hex(gdt[i].base_h),hex(gdt[i].base_l)," ",hex(gdt[i].lim_l)); inc(i); end end;

procedure Save_RG;Assembler;

asm { Сохранение значений сегментных регистров DS,SS,ES} mov Real_Znach_ds,ds mov Real_Znach_ss,ss mov Real_Znach_es,es mov Real_Znach_cs,cs end; {save_rg} procedure Analiz; {Assembler;} begin asm mov ax,2 end;

end;

procedure real_code;Assembler;

asm inc ax inc cx inc ax inc cx mov es,es_ mov segm,ax end;

procedure post(ofs,sel:word);

var i,cur_ofs,cur_ofs1,cur_ofs_:word; { Текущее смещение } cod_p,cod,cod1,cod2,cod3,cod4,k,cod1_: byte;

function Dlin_Kom(cod:byte):integer;

var md, rm : byte;

begin md:=cod shr 6;rm:=cod and 7;

case md of

$0 : case rm of

$0..$5,$7 : Dlin_Kom:=1;

$6 : Dlin_Kom:=2;

end;

$1 : Dlin_Kom:=2;

$2 : Dlin_Kom:=3;

$3 : Dlin_Kom:=1;

end;{case} end;{Dlin_Kom} begin asm mov es_,es { Сохранить ES в es_ } end;

cur_ofs:=ofs; { Текущее смещение процедуры } i:=1; { Номер команды процедуры } repeat asm mov es,sel { Загрузить селектор в ES } mov bx, cur_ofs dec bx mov al, byte ptr es:[bx] { Префикс команды: } mov cod_p,al { cod_p } mov al, byte ptr es:[bx 1] { 1-й байт команды (КОП): } mov cod,al mov al, byte ptr es:[bx 2] { 2-й байт команды } mov cod1,al { (modregr/m): cod1 } mov al, byte ptr es:[bx 3] { 3-й байт команды: } mov cod2,al { cod2 } mov al, byte ptr es:[bx 4] { 4-й байт команды: } mov cod3,al { cod3 } mov al, byte ptr es:[bx 5] { 5-й байт команды } mov cod4,al { cod4 } cmp cod,9ah { Это команда межсегментного перехода? } jnz @2 { Если да: } mov ax, word ptr es:[bx 2] { определение смещения } mov cod_ofs,ax mov ax, word ptr es:[bx 4] { и селектора перехода } mov cod_sel,ax mov al,0cch mov byte ptr es:[bx 1],al jmp @2

@1: cmp cod,8eh { Это команда загрузки сегмента данных? } jnz @2 { Если да: } mov al,35h mov byte ptr es:[bx],al jmp @2 mov ax,sel_cs { Занесение значения CS процедуры } mov es,ax { Real_code в регистр ES } mov bx,offset real_code mov al,cod_p { Запись префикса искомой команды в } mov byte ptr es:[bx],al { качестве 1-го байта процедуры } mov al,8bh { Замена: вместо сегментного регистра } mov byte ptr es:[bx 1],al { будет загружаться регистр AX } mov al,cod1 { Коррекция байта modregm/r } and al,0c7h mov byte ptr es:[bx 2],al mov al,cod2 mov byte ptr es:[bx 3],al { Занесение 3-го байта } xor ax,ax { искомое значение сегментного регистра }

@2:mov es,es_ end;

cur_ofs1:=cur_ofs;

case cod of

$88..$8B : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$C6 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 2;

$C7 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 3;

$B0..$B7 : cur_ofs:=cur_ofs 2;

$B8..$BF : cur_ofs:=cur_ofs 3;

$A0..$A3 : cur_ofs:=cur_ofs 3;

$8E,$8C : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$FF : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$50..$57 : cur_ofs:=cur_ofs 1;

$06,$0E, $16,$1E : cur_ofs:=cur_ofs 1;

$68 : cur_ofs:=cur_ofs 3;

$6A : cur_ofs:=cur_ofs 2;

$60 : cur_ofs:=cur_ofs 1;

$8F : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$58..$5F : cur_ofs:=cur_ofs 1;

$07,$17, $1F : cur_ofs:=cur_ofs 1;

$61 : cur_ofs:=cur_ofs 1;

$86,$87 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$90..$97 : cur_ofs:=cur_ofs 1;

$E4,$E5 : cur_ofs:=cur_ofs 2;

$EC,$ED : cur_ofs:=cur_ofs 1;

$E6,$E7 : cur_ofs:=cur_ofs 2;

$EE,$EF : cur_ofs:=cur_ofs 1;

$D7 : cur_ofs:=cur_ofs 1;

$8D : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$C4,$C5 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$9C..$9F : cur_ofs:=cur_ofs 1;

$00..$03 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$80, $82,$83 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 2;

$81 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 3;

$04 : cur_ofs:=cur_ofs 2;

$05 : cur_ofs:=cur_ofs 3;

$10..$13 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$14 : cur_ofs:=cur_ofs 2;

$15 : cur_ofs:=cur_ofs 3;

$FE,$FF : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$40..$47 : cur_ofs:=cur_ofs 1;

$28..$2B : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$2C : cur_ofs:=cur_ofs 2;

$2D : cur_ofs:=cur_ofs 3;

$18..$1B : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$1C : cur_ofs:=cur_ofs 2;

$1D : cur_ofs:=cur_ofs 3;

$FE,$FF : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$48..$4F : cur_ofs:=cur_ofs 1;

$38..$3B : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$3C : cur_ofs:=cur_ofs 2;

$3D : cur_ofs:=cur_ofs 3;

$F6,$F7 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$27,$37 : cur_ofs:=cur_ofs 1;

$2F,$3F : cur_ofs:=cur_ofs 1;

$69 : cur_ofs:=cur_ofs 4;

$6B : cur_ofs:=cur_ofs 3;

$D4,$D5 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$98,$99 : cur_ofs:=cur_ofs 1;

$D0..$D3 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$C0,$C1 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 2;

$20..$23 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$24 : cur_ofs:=cur_ofs 2;

$25 : cur_ofs:=cur_ofs 3;

$84,$85 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$F6 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 2;

$F7 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 3;

$A8 : cur_ofs:=cur_ofs 2;

$A9 : cur_ofs:=cur_ofs 3;

$08..$0B : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$0C : cur_ofs:=cur_ofs 2;

$0D : cur_ofs:=cur_ofs 3;

$30..$33 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$34 : cur_ofs:=cur_ofs 2;

$35 : cur_ofs:=cur_ofs 3;

$A4,$A5 : cur_ofs:=cur_ofs 1;

$A6,$A7 : cur_ofs:=cur_ofs 1;

$AE,$AF : cur_ofs:=cur_ofs 1;

$AC,$AD : cur_ofs:=cur_ofs 1;

$AA,$AB : cur_ofs:=cur_ofs 1;

$6C..$6F : cur_ofs:=cur_ofs 1;

$F2,$F3 : cur_ofs:=cur_ofs 2;

$E8 : cur_ofs:=cur_ofs 3;

$9A : cur_ofs:=cur_ofs 5;

$EB : cur_ofs:=cur_ofs 2;

$E9 : cur_ofs:=cur_ofs 3;

$EA : cur_ofs:=cur_ofs 5;

$C3 : cur_ofs:=cur_ofs 1;

$C2 : cur_ofs:=cur_ofs 3;

$CB : cur_ofs:=cur_ofs 1;

$CA : cur_ofs:=cur_ofs 3;

$70..$7F : cur_ofs:=cur_ofs 2;

$E0..$E3 : cur_ofs:=cur_ofs 2;

$C8 : cur_ofs:=cur_ofs 4;

$C9 : cur_ofs:=cur_ofs 1;

$CD : cur_ofs:=cur_ofs 2;

$CC : cur_ofs:=cur_ofs 1;

$CE : cur_ofs:=cur_ofs 1;

$CF : cur_ofs:=cur_ofs 1;

$62 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$F8..$FD : cur_ofs:=cur_ofs 1;

$F4,$F5 : cur_ofs:=cur_ofs 1;

$9B : cur_ofs:=cur_ofs 1;

$65,$F0 : cur_ofs:=cur_ofs 1;

$0F : cur_ofs:=cur_ofs 2;

$D8..$DF : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

$26,$2E, $36,$3E : cur_ofs:=cur_ofs 1;

$0F : cur_ofs:=cur_ofs Dlin_Kom(cod2) 2;

$63 : cur_ofs:=cur_ofs Dlin_Kom(cod1) 1;

end;

write(i:4,". ",sel,":",cur_ofs1," Код => ",hex(cod):3,";");

if (cur_ofs-cur_ofs1) >1 then write(" ",hex(cod1):3," ");

if (cur_ofs-cur_ofs1) >2 then write(" ",hex(cod2):3," ");

if (cur_ofs-cur_ofs1) >3 then write(" ",hex(cod3):3," ");

if (cur_ofs-cur_ofs1) >4 then write(" ",hex(cod4):3," ");

inc(i);

if cod=$9a then begin writeln("Межсегментный переход!");

with table[i_table] do begin segm:=sel;ofs:=cur_ofs1;cod:=$9a;descr:=sel_descr; end;

inc(i_table); { Формирование дескриптора сегмента кода: } init_gdt(i_descr,$ffff,lin_adr(cod_sel,0),acc_code,0,0);

inc(i_descr);sel_descr:=sel_descr 8;post(cod_ofs,cod_sel);

end;

until (cod=$C3) or (cod=$CB) or (cod=$C2) or (cod=$CA);{ret} writeln("End of procedure");readkey;

end;{post} begin textbackground(0);clrscr;textcolor(15);

asm cli end; w:=0; i_table:=0;

for i:=0 to 9 do table[i].segm:=0;

MEML[0:3*4]:=Longint(@int3); asm sti end;

i_descr:=6; sel_descr:=$30;Save_RG;

writeln("Значение DS,SS,ES,CS для реального режима : ", hex(Real_Znach_ds), ",",hex(Real_Znach_ss),",", hex(Real_Znach_es)," ",hex(Real_Znach_cs)); sel_cs:=Cseg;

asm mov ofs_analiz,offset analiz end; post(ofs_analiz,Cseg);

analiz;

writeln("w=",w," sp=",sp_," cod_=",hex(cod_)," bp=",bp_," ss=",hex(ss_)," cs=",hex(cs_)," ds=",hex(ds_)," bx=",bx_); i:=0;

while table[i].segm0 do with table[i] do begin writeln("segm=",segm, " ofs=",ofs," cod=",hex(cod)," desr=",hex(descr));inc(i);

end; readkey;

lim1:=0; lim2:=10;

{---Определение значения сегмента кода cs1 процедур,описанных в модуле PROT----} cs1:=Seg(int_30h);

excep:=$ff; { Отличное от FFH значение переменной excep } semaf:=0; { Начальная установка семафора } res:=0; { МП сброшен не был }

{-----------Определение типа микропроцессора----------------} get_cpu_type(0,cpu_type); { В cpu_type - номер типа МП } if cpu_type=2 then t:=0 { 16-разрядный МП } else t:=8; { 32-разрядный МП }

{ Формирование байта доступа прерывания: } acc_int:=present OR type_int OR t;

{ Формирование байта доступа ловушки: } acc_trap:=present OR type_trap OR t;

{--------------Формирование таблицы GDT-------------------- }

{ Нуль-дескриптор: } init_gdt(0,0,0,0,0,0);

init_gdt(1,$ffff,lin_adr(cseg,0),acc_code,0,0);

init_gdt(2,$ffff,lin_adr(cs1,0),acc_code,0,0);

init_gdt(3,$ffff,lin_adr(dseg,0),acc_data $60,0,0);

init_gdt(4,0,lin_adr(sseg,0),acc_stack,0,0);

init_gdt(5,4000-1,lin_adr($b800,0),acc_data,0,0);

{------Формирование данных регистра GDTR и его загрузка-----} out_GDT; readkey; exit; init_gdtr;

{----Определение селектора (sel_ret) и смещения (ofs_ret)---} sel_ret:=Cseg;

asm mov ofs_ret,offset ret_r end;

{-------------Формирование данных для перехода на метку ret_r после сброса МП-------} save_ret_real(sel_ret,ofs_ret,5);

not_int;{------Запрет маскируемых и немаскируемых прерываний--------}

{--------------Формирование таблицы IDT-------------------- } init_idt(0,ofs(exc_00),code_sel2,acc_trap);

init_idt(1,ofs(exc_01),code_sel2,acc_trap);

init_idt(2,ofs(exc_02),code_sel2,acc_trap);

init_idt(3,ofs(exc_03),code_sel,acc_trap);

init_idt(4,ofs(exc_04),code_sel2,acc_trap);

init_idt(5,ofs(exc_05),code_sel2,acc_trap);

init_idt(6,ofs(exc_06),code_sel2,acc_trap);

init_idt(7,ofs(exc_07),code_sel2,acc_trap);

init_idt(8,ofs(exc_08),code_sel2,acc_trap);

init_idt(10,ofs(exc_10),code_sel2,acc_trap);

init_idt(11,ofs(exc_11),code_sel2,acc_trap);

init_idt(12,ofs(exc_12),code_sel2,acc_trap);

init_idt(13,ofs(exc_13),code_sel2,acc_trap);

init_idt(14,ofs(exc_14),code_sel2,acc_trap);

init_idt(16,ofs(exc_16),code_sel2,acc_trap);

init_idt(17,ofs(exc_17),code_sel2,acc_trap);

init_idt(18,ofs(exc_18),code_sel2,acc_trap);

init_idt($20,ofs(PIC_1),code_sel2,acc_int);

init_idt($21,ofs(keyb),code_sel2,acc_int $60);

for i:=2 to 7 do init_idt($20 i,ofs(PIC_1),code_sel2,acc_int);

for i:=8 to 15 do init_idt($20 i,ofs(PIC_2),code_sel2,acc_int);

init_idt($30,ofs(int_30h),code_sel2,acc_trap);

init_idtr_p;

init_idtr_r;

pic(1);

save_sreg;

real_sp:=SPTR;

if cpu_type=2 then

{--------Переход в защищенный режим для МП 80386 и выше-----} asm { Установка бита PE=1 в регистре управления CR0: } db 0fh,20h,0c0h { MOV EAX,CR0 } db 66h,0dh { OR EAX,1 } dd 1h db 0fh,22h,0c0h { MOV CR0,EAX } end;

asm db 0eah { Межсегментный переходна метку @prot } dw offset @prot { для очистки буфера команд МП } dw code_sel { и загрузки регистра CS }

@prot:mov ds,data_sel { DS, } mov ss,stack_sel { SS } mov es,video_sel { и ES } mov ah,1 { Установка маркера: } mov bx,1001h { строка 1, столбец 10 } int 30h mov ah,4 { Вывод строки s на экран: } mov dh,1eh { видеоатрибут, } mov si,offset s { адрес строки } int $30 mov ah,1 { Установка маркера } mov bx,004h int 30h mov ah,4 { Вывод строки s1 на экран: } mov dh,30h mov si,offset s1 int $30 mov ah,1 { Установка маркера } mov bx,006h int 30h sti

@wait: cmp semaf,0 jz @wait cmp cpu_type,2 jnz @mov db 9ah { межсегментный вызов процедуры reset } dw offset reset dw code_sel2

{---Подготовка к возврату в реальный режим по команде MOV---}

@mov:mov ds,data_sel mov ss,data_sel mov es,data_sel

{---------------Восстановление атрибутов IDT----------------} db 0fh,01h,1eh { LIDT idtr_r } dw idtr_r

{-------Возврат в реальный режим по команде MOV-------------} db 0fh,20h,0c0h { MOV EAX,CR0 } db 66h,25h { AND EAX,FFFFFFFEH } dd 0fffffffeh db 0fh,22h,0c0h { MOV CR0,EAX } mov bx,offset ofs_ret db 0ffh { Косвенный межсегментный переходна метку ret_r } db 2fh { для очистки буфера команд МП и загрузки CS }

{db 2eh} {вместо 2fh}

{dw ofs_ret}

{-----------------Работа в реальном режиме------------------} ret_r: xor ax,ax mov ds,ax mov ds,ds:[4*$60] { DS, } mov ss,real_ss { SS, } mov es,real_es { ES } mov sp,real_sp { и SP } end;

if res=0 then test_wr; { Если запрет сохранился - }

{ вырабатывается прерывание 13, обработчик которого }

{ с помощью процедуры reset сбрасывает МП }

{----------Размаскирование контроллеров прерываний----------} port[$21]:=0; { первого КП } port[$a1]:=0; { и второго КП }

{-----Разрешение маскируемых и немаскируемых прерываний-----} en_int;

{-------------Проверка возникновения исключений-------------} if excep$ff then {if excep=11 then writeln("Обработано исключение 11 (селектор ", err shr 3,")") else} writeln("Исключение ",excep);

{----------Анализ возврата МП из защищенного режима---------} if res=0 then s:="по команде MOV" else s:="через сброс МП";

writeln("Возврат из защищенного режима выполнен ",s);

writeln("prov=",prov,ss);

readkey;

end.

Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность
своей работы


Новые загруженные работы

Дисциплины научных работ





Хотите, перезвоним вам?