48214 (Програма модифікуюча команди, які використовуються в захищеному режимі), страница 4
Описание файла
Документ из архива "Програма модифікуюча команди, які використовуються в захищеному режимі", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48214"
Текст 4 страницы из документа "48214"
йде відразу після КОП ( коду операції ).
Головна програма :
( program Ade; )
У тексті головної програми здійснює обчислення розміру довжини поточної команди, і перехід, по отриманій довжині, до коду наступної команди.
Список літератури :
-
"Апаратне забезпечення ІBM 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].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);