Смекни!
smekni.com

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

db $0f,$20,0c0h

db 66h,25h

dd 0fffffffeh

db $0f,22h,0c0h

jmp ret_r

Перехід на мітку ret_r необхідний для очищення буфера предвиборки команд.

1.12. Відновлення регістрів МП.

Відновлення регістрів МП виконується в такий спосіб:

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 }


1.13. Дозвіл маскуємих і немаскуємих переривань.

Дозвіл маскуємих і немаскуємих переривань здійснюється за допомогою процедури en_int. Ця процедура також виконує скидання стану клавіш-перемикачів.


2. Система команд мікропроцесора :

2.1. Кодування регістрів.

При двухбітовому полі rg :

Таблиця 4.

rg 00 01 10 11
Сегментні регістри Es Cs Ss Ds

При трьохбітовому полі rg :

Таблиця 5.

Reg 000 001 010 011 100 101 110 111
W=0 Al Cl Dl Bl Ah Ch Dh Bh
W=1 Ax Cx Dx Bx Sp Bp Si Di

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

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

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

Таблиця 6.

Mod DISP R/m EA
00 0 000001010011100101110111 EA = (BX) + (SI)EA = (BX) + (DI)EA = (BP) + (SI)EA = (BP) + (DI)EA = (SI)EA = (DI)EA = DISPEA = (BX)
01 Disp-low с расширением со знаком 000001010011100101110111 EA = (BX) + (SI) + DISPEA = (BX)+(DI) + DISPEA = (BP)+(SI) + DISPEA = (BP)+(DI) + DISPEA = (SI) + DISPEA = (DI) + DISPEA = (BP) + DISPEA = (BX) + DISP
10 Disp-high : Disp-low 000001010011100101110111 EA = (BX) + (SI) + DISPEA = (BX)+(DI) + DISPEA = (BP)+(SI) + DISPEA = (BP)+(DI) + DISPEA = (SI) + DISPEA = (DI) + DISPEA = (BP) + DISPEA = (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;