- •Затверджую Начальник спеціальної кафедри № 5
- •Методична розробка
- •Тема 1. Мови асемблера та їх використання для побудови базових елементів системних програм.
- •Тема 1/1
- •Контрольні запитання з попереднього знайомства з системними програмами
- •Мета дисципліни
- •Призначення системних програм в захищених системах та технологіях комунікацій
- •Системні управляючі та обробляючі програми
- •2. Типова структура системних програм
- •3. Особливості архітектури і адресації даних в різних режимах роботи процесорів
- •Розрахунки логічних і фізичних адрес даних в пам'яті
Розрахунки логічних і фізичних адрес даних в пам'яті
На етапі трансляції:
з мови асемблера при використанні даних з операторів assume при неявному визначенні елементів адрес;
з вставок на мові асемблера до програм, складених на мовах високого рівня у відповідності з угодою організації та використання окремих сегментів та блоків даних.
На етапі виконання:
в реальному режимі - з адрес занесених в сегменті регістри;
в захищеному режимі з побайтним доступом для сегментів - з дескрипторів сегментів, номери яких розміщені в сегментних регістрах вибирається початкова адреса сегмента, до якої додається зміщення логічної або фізичної адреси даних;
в захищеному режимі з сторінковим доступом для сегментів – після обчислення логічної адреси за таблицею сторінок обчислюється фізична адреса, прихована в режимі налагодження програм.
Сегментні регістри коду CS (Code Segment), даних DS (Data Segment), додатковий сегментний регістр даних ES (Extra Segment), стека SS (stack segment). В процесорах, починаючи з 80386, з’явились ще два додаткових сегментних регістри для доступу до даних FS і GS використовуються як додаткові (букви “F” і “G” взяті для назв як наступні в латинському алфавіті за E - Extra). Ці регістри використовуються в реальному режимі для одержання 20-бітових виконавчих адрес ГП для ЦП 8086, 8088, 80186, реального режиму 80286, а також 32-бітових виконавчих адрес реального режиму 80386 і 80486 у відповідності з наведеною нижче ілюстративною схемою або формулою [xS]*16+відносна адреса:
Рис. 1.2. Розрахунок виконавчої адреси в захищеному режимі
В формулі xS – це узагальнений сегментний регістр, а [xS] – його вміст, що являє собою сегментну адресу. Відносна адреса в реальному режимі визначається як сума з вмістом базового та індексного регістрів за модулем, що дорівнює значенню граничного зміщення. Повне зміщення в свою чергу визначається прямою адресою або сумою 16- або 32-розрядних [*3] індексних і базових регістрів зі зміщенням (displacement – в скорочених позначення тексту книги d8, d16 і d32 [*3]), указаним в команді. Перенос за старший розряд повного зміщення ігнорується, і діюча адреса не може вийти за межі 64 Кбайтів сегмента. А довга виконавча адреса може сформуватися тільки в удосконалених моделях процесорів [*3] за рахунок переносу в розряди сегментної адреси і використання 32-разрядної відносної адреси. Однак слід відзначити, що реальний режим з розширеною адресацією практично не можливо застосувати через обмеження розміру сегментів реального режиму розміром в 64 Кбайти, що може бути подолано тільки в процесорах фірми AMD, сумісних з Pentium.
|
|
|
|
15 0 |
|
||||||
Селектор в сегментному регістрі |
xS |
|
i i i i i i i i i i i i i l p p |
|
|||||||
|
|
|
& |
|
|
||||||
|
|
|
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 |
|
|||||||
Адреса однієї з таблиць дескрипторів LDTR при l=1 або GDTR при l=0 |
31 |
|
0 |
||||||||
+ |
a a … a a a a a a a a a a a a a a a a a |
|
|||||||||
|
|
|
|||||||||
Копія дескриптора розміщається в тіньовому регістрі регістра сегмента |
|
= |
Адреса дескриптора сегмента |
|
|||||||
|
|
|
|
||||||||
|
До таблиці дескрипторів в пам’яті |
|
|||||||||
63 |
|
48 |
47 40 |
39 32 |
|||||||
База сегмента (31..24) |
G D x U Межа (19..16) |
p d d s t t t A |
База сегмента (23..16) |
||||||||
31 |
16 |
15 |
0 |
||||||||
База сегмента (15..0) |
Межа сегмента (15..0) |
Рис. 1.3. Доступ до дескриптора сегмента
В захищеному режимі сегментна адреса обирається з дескрипторів як вміст полів, позначених на рис. 1.3 як “База” і “База сегмента”. Відносна адреса визначається аналогічно реальному режиму, але з використанням більш різноманітних формул, які розглядатимуться при вивченні машинних команд. Крім того, дескриптор зберігає границю сегмента, яка провіряється при виконанні команди. Інші розряди носять управляючий характер і розглядаються при вивченні захищеного режиму.
Розмір даних і кількість наступних байтів команди визначається конкретним кодом операції і наявністю в команді фіксованих байтів префіксів переключення розрядності даних і адресації. Тут буквами o позначені біти коду операції; d – напрямок пересилки результату, який звичайно обирається транслятором; w – формат даних (“0” – байт, “1” – слово або подвійне слово); mod – модифікація операндів; r/m – регістр або покажчик типа операнда. В машинній формі після основної частини команди з покажчиками модифікацій адреси в пам’яті може розміщуватися: двобайтна адреса для прямої адресації, однобайтне d8 або двобайтне d16 зміщення, одно- або двобайтні безпосередні дані i8 або i16; двобайтне зміщення і двобайтна сегментна адреса для прямої міжсегментної адресації. Довжина команд ЦП без префіксів може досягати шести байтів. Деякі групи команд мають додаткові скорочені формати, які обробляються дещо швидше. Якщо на код операції і режим адресації виділено два байти, то другий байт зберігає поля mod і r/m, а також біт w, стан яких визначає різні режими адресації і призначення сегментних регістрів за умовчанням. Допустимі варіанти 16-бітових адрес процесорів iх86 наведені в таблиці 2.1 [25] з явним визначенням сегментних регістрів, що використовуються за умовчанням, і кількості додаткових циклів, що витрачаються на адресацію в процесорі 8086.
Таблиця 1.1
r/m |
mod=00 |
Дц |
mod=01/10 |
дц |
mod=11 w=0 |
mod=11 w=1 |
000 |
DS:[BX][SI] |
7 |
DS:/d8/d16[BX][SI] |
11 |
AL |
AX |
001 |
DS:[BX][DI] |
7 |
DS:/d8/d16[BX][DI] |
11 |
CL |
CX |
010 |
SS:[BP][SI] |
8 |
SS:/d8/d16[BP][SI] |
12 |
DL |
DX |
011 |
SS:[BP][DI] |
8 |
SS:/d8/d16[BP][DI] |
12 |
BL |
BX |
100 |
DS:[SI] |
5 |
DS:/d8/d16[SI] |
9 |
AH |
SP |
101 |
DS:[DI] |
5 |
DS:/d8/d16[DI] |
9 |
CH |
BP |
110 |
DS:d16 |
6 |
SS:/d8/d16[BP] |
9 |
DH |
SI |
111 |
DS:[BX] |
5 |
DS:/d8/d16[BX] |
9 |
BH |
DI |
В таблиці [регістр] – означає вміст указаного регістра, який додається при формуванні виконавчої адреси в межах 64 Кбайтів використаного сегмента, а ім’я сегментного регістра визначає використання сегментного регістра за умовчанням. Додаткові цикли звертання до пам’яті (дц) наведені для процесорів Intel-8086/88. В 32-бітових процесорах при визначенні префікса 32-бітових даних замість двобайтних регістрів використовуються чотирибайтні регістри з додатковою початковою буквою E.
Транслятор з мови Асемблера автоматично контролює допустимість операнда і генерує коди, включаючи префікси, у відповідності с заданою моделлю і режимом роботи процесора для будь-якого операнда, що указує на пам’ять і заданого в узагальненій стандартній формі:
Ім’я_облaсті_пам’яті_зі_зміщенням [ім’я_pегістpa_бaзи]
[ім’я_pегістpa_індексa * коефіцієнт ]
В цьому запису може бути опущено будь-який з трьох елементів або коефіцієнт. 32-paзpядна ефективна адреса формується у відповідності з табл. 1.2 і 1.3.
Таблиця 1.2
-
Префікс 66h для переключення адрес до 16-бітового режиму
-
r/m
Mod=00
mod=01/10
mod =11; w=0, w=1
000
DS:[EAX]
DS:d8/d32[EAX]
AL EAX
001
DS:[ECX]
DS:d8/d32[ECX]
CL ECX
010
DS:[EDX]
DS:d8/d32[EDX]
DL EDX
011
DS:[EBX]
DS:d8/d32[EBX]
BL EBX
100
Управління байтом SIB (табл. 2.3)
AH ESP
101
DS:d32
SS:d8/d32[EBP]
CH EBP
110
DS:[ESI]
DS:d8/d32[ESI]
DH ESI
111
DS:[EDI]
DS:d8/d32[EDI]
BH EDI
Формат байта SIB:
S
= s
s
– масштаб scale: 00
[i
i i]
* 1 01
[i
i i]
* 2 10
[i
i i]
* 4
11
[i
i i]
* 8
S = s s |
I = i i i |
b b b |
I = i i i – індексний регістр index
b b b – базовий регістр base
Якщо поле r/m пост-байта має двійкове значення 100, то використовується байт SIB і формування 32-бітової ефективної адреси визначається в Табл. 1.3.
Таблиця 1.3
|
Префікс 66h для переключення адрес до 16-бітового режиму |
||
base |
Mod=00 |
mod=01/10 |
mod =11; w=0, w=1 |
000 |
DS:[EAX+I*S] |
DS:d8/d32[EAX+I*S] |
AL AX EAX |
001 |
DS:[ECX+I*S] |
DS:d8/d32[ECX+I*S] |
CL CX ECX |
010 |
DS:[EDX+I*S] |
DS:d8/d32[EDX+I*S] |
DL DX EDX |
011 |
DS:[EBX+I*S] |
DS:d8/d32[EBX+I*S] |
BL BX EBX |
100 |
SS:[ESP+I*S] |
SS:d8/d32[ESP+I*S] |
AH SP ESP |
101 |
DS:[d32+I*S] |
SS:d8/d32[EBP+I*S] |
CH BP EBP |
110 |
DS:[ESI+I*S] |
DS:d8/d32[ESI+I*S] |
DH SI ESI |
111 |
DS:[EDI+I*S] |
DS:d8/d32[EDI+I*S] |
BH DI EDI |
Завдання на самостійну роботу: повторити матеріал лекції; вивчити основні поняття.
/ В.І.Пустоваров /