2.2.     Визначення ефективної адреси.

Ефективна адреса EA операнда в пам'яті визначається в залежності від значень полів : mod і r/m :

Визначення ефективної адреси :

Таблиця 6.

Mod DISP R/m EA
00 0

000

001

010

011

100

101

110

111

EA = (BX) + (SI)

EA = (BX) + (DI)

EA = (BP) + (SI)

EA = (BP) + (DI)

EA = (SI)

EA = (DI)

EA = DISP

EA = (BX)

01

Disp-low с расширением

со знаком

000

001

010

011

100

101

110

111

EA = (BX) + (SI) + DISP

EA = (BX)+(DI) + DISP

EA = (BP)+(SI) + DISP

EA = (BP)+(DI) + DISP

EA = (SI) + DISP

EA = (DI) + DISP

EA = (BP) + DISP

EA = (BX) + DISP

10 Disp-high : Disp-low

000

001

010

011

100

101

110

111

EA = (BX) + (SI) + DISP

EA = (BX)+(DI) + DISP

EA = (BP)+(SI) + DISP

EA = (BP)+(DI) + DISP

EA = (SI) + DISP

EA = (DI) + DISP

EA = (BP) + DISP

EA = (BX) + DISP

11  –

Код

регистра


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

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

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

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

ЗАТВЕРДЖУЮ

Зав. Кафедрою xxxx.

___________ /xxxxxx./

_________________ 2002р.

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

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

Xxxxxx- 01 13 01-1 ЛЗ

Розробники :

Керівник проекту :

________ / xxxxxxx./

___________________ 2002р.

Виконавець :

_______ / Хххххххххххх Х.Х./

___________________ 2002р.

Харків

2002


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

Xxxxxx- 01 13 01-1 ЛЗ

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

2002


Опис програми

Зміст

1.         Опис змінних.

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

3.         Список літератури.


1.         Опис змінних.

Змінна Тип Призначення
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

Шеснадцятирічне значення

чисел.

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

Процедура 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; )

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


Список літератури :

1.   "Апаратне забезпечення ІBM PC " (частина 1) Діалог - Мифи

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

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

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

5.   Методичні вказівки "Робота з машинними кодами і прямою доступ до пам'яті і портів у мові 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].acc<>0 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].segm<>0 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.


Информация о работе «Програма модифікуюча команди, які використовуються в захищеному режимі»
Раздел: Информатика, программирование
Количество знаков с пробелами: 47456
Количество таблиц: 8
Количество изображений: 0

Похожие работы

Скачать
97603
5
0

обачив світло спрощений варіант процесора Pentium II, назва ,що отримала Celeron. В ньому вдвічі зменшений вторинний кеш і, немовби, прибрана підтримка багатопроцесорних систем. Однак шляхом “хірургічного” втручання підтримку багатопроцесорності можна повернути. Це пояснюється тим, що в Celeron застосоване ядро Pentium II без будь-яких змін. В 1999 році з'явився процесор Pentium III. В ньому ...

Скачать
98338
2
0

... і друку інформації про конфігурацію системи. ·             Backup. Засоби архівування даних призначені для резервного копіювання інформації на локальний носій на магнітній стрічці. Операційна система Windows NT завжди володіла прекрасними і широко застосовними на практиці можливостями захисту. Однократна реєстрація в домені Windows NT надає користувачам доступ до ресурсів всієї корпоративної ...

Скачать
72476
0
0

... . Користувач може вільно робити резервні копії й переносити програму з одного комп'ютера на інший, переносячи з собою ключ. [3] Деякі питання розкриття і розслідування злочинів у сфері комп’ютерної інформації Правоохоронні органи неготові до адекватного протистояння й активної боротьби з цим вже не новим соціальним явищем. Цей вид злочинності завдає величезних збитків власникам і користувачам ...

Скачать
114386
2
2

... передбаченою. 3. Генерація гамми не повинна бути дуже трудомісткою. Слід зазначити, що алгоритми криптосистем з відкритим ключем (СВК) можна використовувати за трьома напрямками: 1. Як самостійні засоби захисту даних, що передаються чи зберігаються. 2. Як засіб для розподілу ключів. Алгоритми СВК більш трудомісткі, ніж традиційні криптосистеми. Обмін великими інформаційними потоками здійснюють ...

0 комментариев


Наверх