48214 (Програма модифікуюча команди, які використовуються в захищеному режимі), страница 3
Описание файла
Документ из архива "Програма модифікуюча команди, які використовуються в захищеному режимі", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48214"
Текст 3 страницы из документа "48214"
NE (Numeric Error) - біт керування обробкою помилок FPU : якщо NE=0, то встановлюється схема обробки помилок, використовувана в МП 80286 і 80386 - через зовнішнє переривання IRQ 13 (переривання від співпроцесора). При цьому на вхід IRQ 13 контролера переривань надходить сигнал FERR# від МП, що приймає активний (низький) рівень при помилці FPU. Вхідний сигнал МП IGNNE# низьким рівнем дозволяє заборонити обробку помилок FPU. Якщо NE=1, помилки співпроцесора обробляються як внутрішні переривання з номером 16;
WP (Write Protection) - біт захисту від запису забороняє запис у сторінки, потрібні тільки для читання для всіх програм;
AM (Alignment Mask) - біт маски вирівнювання: при AM=0 забороняється перевірка невирівняності операндів;
NW (Not Write through) - біт заборони запису в кеш-пам'ять;
CD (Cache Disable) - біт заборони кэшировання, тобто заповнення рядка кеш-пам'яті;
PG (PaGing) - біт дозволу сторінкової організації. Установка PG=1 дозволена тільки в захищеному режимі, тобто при PE=1.
Занесення даних у регістр CR0 для мікропроцесорів починаючи с 80386 виконується спеціальною командою MOV, що здійснює промін із системними регістрами.
У МП 80286 замість 32-розрядного регістра CR0 мається 16-розрядний регістр MSW (Machine Status Word). Занесення даних у MSW виконується командою LMSW. Для сумісності молодші 16 розрядів CR0 збігаються з MSW і запис у них може здійснюватися також і командою LMSW.Установка біта PE здійснюється для мікропроцесора 80286 за допомогою команди LMSW, що заносить значення перемінної msw у регістр MSW: db 0fh,01h,36h { LMSW }
dw msw
jmp @prot
Для МП починаючи з 80386 установка біта PE CR0 без зміни інших розрядів регістра керування здійснюється за допомогою команди MOV:
db $0f,$20,0c0h { MOV EAX,CR0 }
db 66h,0dh { OR EAX,1 }
dd 1h
db $0f,22h,0c0h { MOV CR0,EAX }
jmp @prot
Відразу після переходу МП у захищений режим необхідно виконати програмний перехід для очищення буфера предвиборки від команд, занесених туди в реальному режимі. Перехід здійснюється на мітку @prot, з яким і починається робота МП у захищеному режимі. Помітимо, що оскільки в програмі P_MODE не було потрібно перевантажувати сегментний регістр коду (у захищеному режимі використовувалися ті ж базова адреса і розмір сегмента і того ж права доступу), те використовується внутрісегментний перехід і завантаження регістра
CS не відбувається. Потім у сегментні регістри DS, SS і ES завантажуються відповідні селектори:
@prot:mov ax,data_sel
mov ds,ax
mov ax,stack_sel
mov ss,ax
mov ax,video_sel
mov es,ax
На цьому переклад мікропроцесора в захищений режим завершується.
-
Повернення в реальний режим.
Для повернення в реальний режим для МП 80286 використовується процедура RESET , що встановлює ознаку виконання скидання мікропроцесора (res=1), за допомогою команди контролера клавіатури здійснює скидання МП : mov al,$fe
out $64,al
і очікує завершення скидання мікропроцесора:
@wait_res:
hlt
jmp @wait_res.
Після скидання МП BIOS виконує перехід на крапку входу, адреса яке зберігається в осередку $40:$67. Для МП починаючи з 80386 повернення в реальний режим виконується за допомогою команди MOV, що здійснює скидання біта PE регістра CR0. Перед цим необхідно виконати наступні дії :
а) заборонити апаратні переривання командою CLI;
б) передати керування сегменту коду з R=1 і FFFFh;
в) завантажити в сегментні регістри DS, SS, ES селектори сегмента, що має атрибути, відповідні реальному режиму: границю сегмента, рівну 64ДО-1, ED=0 і W=1;
г) за допомогою команди LIDT завантажити в IDTR базова адреса (0) і границю (1Кб - 1) таблиці векторів реального режиму;
д) очистити біт PE регістра CR0;
е) здійснити межсегментний перехід.
З перерахованих вище дій у даній програмі потрібно виконати тільки пункти а), в), і д). Пункт б) не потрібно виконувати оскільки сегмент виконуваного коду уже володіє зазначенними параметрами. Пункт г) не потрібно, тому що в захищеному режимі не оброблялися і таблиця векторів (тобто IDT) і її розташування в пам'яті не були змінені.
Нарешті, пункт е) не потрібний через те, що не було завантаження регістра CS при вході в захищений режим.
Для завантаження сегментних регістрів DS, SS і ES використовується
селектор сегмента даних data_sel, що задовольняє перерахованим у пункті в) умовам : mov ax,data_sel
mov es,ax
mov ds,ax
mov ss,ax.
Очищення біта PE регістра CR0 виконуються командою MOV:
db $0f,$20,0c0h
db 66h,25h
dd 0fffffffeh
db $0f,22h,0c0h
jmp ret_r
Перехід на мітку ret_r необхідний для очищення буфера предвиборки команд.
-
Відновлення регістрів МП.
Відновлення регістрів МП виконується в такий спосіб:
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 }
-
Дозвіл маскуємих і немаскуємих переривань.
Дозвіл маскуємих і немаскуємих переривань здійснюється за допомогою процедури en_int. Ця процедура також виконує скидання стану клавіш-перемикачів.
-
Система команд мікропроцесора :
-
Кодування регістрів.
При двухбітовому полі 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 |
-
Визначення ефективної адреси.
Ефективна адреса 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
Опис програми
Зміст
-
Опис змінних.
-
Опис процедур і функцій.
-
Список літератури.
-
Опис змінних.
Змінна | Тип | Призначення |
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; )
Дана функція здійснює обчислення розміру довжини байта, який