labs&konspeckts / SP_ukr / asm_5
.docУправління пам'яттю процесора
Пам'ять - це місце, де зберігаються програми, записані в машинному коді і дані, необхідні для роботи програм. В процесорах Intel x86 програми і дані знаходяться в одній і тій же пам'яті і для доступу до них існують дві шини - шина адреси (ША) і шина даних (ШД).
Уявімо пам'ять як послідовність байтів, кожен з яких має свій порядковий номер-адресу. Для виконання будь-яких операцій з певною ділянкою пам'яті процесору необхідно вказати адресу першого байта цієї ділянки, подавши його на шину адреси. Після цього шина даних буде пов'язана з комірками, що знаходяться за вказаною адресою і через неї можна здійснювати необхідні операції.
Різні процесори мають різну розрядність ША і ШД. Розрядність ША визначає максимально можливу адресу в пам'яті, а розрядність ШД дорівнює кількості біт, що пересилаються між процесором і пам'яттю за раз.
У 8086 шина адреси складається з 20 ліній, а шина даних - з 16 ліній, тобто процесор може адресувати 220 байт (1 Мегабайт) пам'яті, при цьому одночасно пересилається по 16 біт (2 байти).
Для того, щоб вирішити проблему адресації 16-бітовим процесором пам'яті більшої, ніж 216 байт (64 Кілобайта), в 8086 використовується механізм сегментації. Фізична (20-бітна) адреса логічно представляється двома 16-бітними компонентами - сегментом і зміщенням, які прийнято розділяти знаком «:».
Сегментна компонента задає адресу початку блоку пам'яті (сегмента), розміром 64 кілобайт, а зміщення - кількість байт від початку сегмента до необхідної ділянки. Процесор використовує дуже просту схему визначення фізичної адреси:
Логічна адреса = сегмент: зміщення. Фізична адреса = сегмент * 16 + зміщення.
Звичайно, 16-бітове зміщення дозволяє одну і ту ж адресу задати різними парами сегмент: зміщення. Наприклад, фізичну адресу 65 можна задати як 0:65, 1:49, 2:33, 3:17 і 4:0, але у відлагоджувачі (debugger) ми їх побачимо в 16-річному коді.
В 80386 ША і ШД містять по 32 лінії. Але для сумісності з 8086, в реальному режимі адресувати можна тільки мегабайт пам'яті, хоча на шину даних вже можна передавати подвійні слова (32 біта).
Мета роботи: Вивчити адресацію даних у пам'яті відеобуфера і сегментах різних типів
Адресація даних в пам'яті відеобуфера
Все, що зображено на моніторі - і графіка, і текст, одночасно присутнє в пам'яті, вбудованої в відеоадаптер. Для того щоб зображення з'явилося на моніторі, воно має бути записане в пам'ять відеоадаптера.
Сучасні відеоконтролери підтримують різноманітні текстові та графічні режими виведення інформації на екран, які відрізняються роздільністю, палітрою кольорів, частотою кадрової розгортки і т. д.
Текстові режими розрізняють за роздільністю (числа відображуваних символів по горизонталі і вертикалі) і кольоровою палітрою (можливий монохромний або 16-кольоровий режим)
Для графічних режимів основною ознакою класифікації є кількість одночасно відображених кольорів і, відповідно, кількість двійкових розрядів, необхідних для зберігання однієї точки зображення. Кілька типів режимів:
|
Режим |
Роздільність |
Кількість кольорів |
Адреса відеобуфера |
|
Текстовий кольоровий |
80х25 |
16 |
В800h |
|
Текстовий монохромний |
80х25 |
2 |
В000h |
|
Кольоровий графічний |
320х200 |
16 |
А000h |
|
Кольоровий графічний |
640х200 |
16 |
А000h |
Для текстових режимів відводиться спеціальна область пам'яті, що починається з абсолютної адреси B800h: 0000h і закінчується на B800h: FFFFh, тобто 4000 байт, так що на кожну з 2000 позицій екрану доводиться 2 байта (25 рядків х 80 символів). Перший байт містить АSCII код символу. Апаратура дисплея перетворює номер коду АSCII в зв’язаний з ним символ і посилає його на екран. Другий байт ( байт атрибутів) містить інформацію про те, як повинен бути виведений даний символ. Для монохромного дисплея він встановлює, підкреслення символу, виділення яскравістю або негативом і т.д. У кольорових системах байт атрибутів встановлює основний і фоновий кольори символу.
|
Значення байта - атрибута |
Колір символу |
|
0 |
black |
|
1 |
blue |
|
2 |
green |
|
3 |
cyan |
|
4 |
red |
|
5 |
magenta |
|
6 |
brown |
|
7 |
white |
|
8 |
gray |
|
9 |
light blue |
|
10 |
light green |
|
11 |
light cyan |
|
12 |
light red |
|
13 |
light magenta |
|
14 |
yellow |
|
15 |
bright white |
Формат кодування кольору символу показаний на рис 1:
-
біти 0-3 – колір символу
-
біти 4-6 – колір фону
-
біт 7 – мигання (0 – звичайний текст, 1- мигаючий текст )
-
7
6
5
4
3
2
1
0

Мигання
Рис
1
У текстових режимах за адресою B800h: 0000h лежить байт з кодом символу, що знаходиться у верхньому лівому куті екрана; за адресою B800h: 0001h лежить атрибут цього символу; за адресою B800h: 0002h лежить код другого символу у верхній частині екрана і т.д.
Таким чином, будь-яка програма може вивести текст на екран простою командою пересилання даних, не вдаючись до жодних спеціальних функцій DOS або BIOS.
Адресація даних в сегментах різних типів
Дані можуть зберігатися не тільки в сегменті даних, а й у сегменті коду і в стеку. Особливість зберігання даних в сегменті коду в тому, що вони не повинні оброблятися як команди. Тому дані зазвичай визначають або до точки входу, або між безумовним переходом і міткою переходу:
jmp met
дані
met:
або після останньої команди завершення програми.
У сегменті стека дані можуть визначатися, якщо стек має достатню глибину, тобто (sp)> = 40h, оскільки стек використовується одночасно і системними перериваннями.
Завдання на лабораторну роботу
1. Написати програму для процесора 80386, яка пересилає символьний рядок, з ім'ям і номером варіанта студента. Рядок визначений в одному з сегментів (за варіантом).
2. Рядок символів, що містить ім'я і номер варіанта студента переслати в масив двобайтних слів за певною адресою відеобуфера. Вивести рядок кольором відповідно до варіанта.
Використовувати відлагоджувач (перегляд рядка через ALT + F5)
3. Рядок символів, що містить ім'я і номер варіанта студента переслати також в сегмент коду і стека. Для здачі роботи відкрити відлагоджувач і показати один і той же вміст дампів пам'яті в сегментах коду і стека, а також на екрані.
Таблиця варіантів:
|
№ |
Місцезнаходження рядка-джерела |
Колір |
Номер рядка екрану для виведення |
|
101 |
В сегменті даних |
black |
1 |
|
102 |
В сегменті коду до точки входу |
blue |
2 |
|
103 |
В сегменті коду після команди виходу в ОС |
green |
3 |
|
104 |
В сегменті коду після безумовного переходу |
cyan |
4 |
|
105 |
В сегменті стека |
red |
5 |
|
106 |
В сегменті даних |
magenta |
6 |
|
107 |
В сегменті коду до точки входу |
brown |
7 |
|
108 |
В сегменті коду після команди виходу в ОС |
white |
8 |
|
109 |
В сегменті коду після безумовного переходу |
gray |
9 |
|
110 |
В сегменті стека |
light blue |
10 |
|
111 |
В сегменті коду після безумовного переходу |
light green |
11 |
|
112 |
В сегменті стека |
light cyan |
12 |
|
113 |
В сегменті даних |
light red |
13 |
|
114 |
В сегменті коду до точки входу |
light magenta |
14 |
|
115 |
В сегменті коду після команди виходу в ОС |
yellow |
15 |
|
116 |
В сегменті у після безумовного переходу |
bright white |
16 |
|
117 |
В сегменті стека |
black |
17 |
|
118 |
В сегменті даних |
blue |
18 |
|
119 |
В сегменті коду до точки входу |
green |
19 |
|
120 |
В сегменті коду після команди виходу в ОС |
cyan |
20 |
|
121 |
В сегменті коду після безумовного переходу |
red |
21 |
|
122 |
В сегменті стека |
magenta |
22 |
|
123 |
В сегменті коду після безумовного переходу |
brown |
23 |
|
124 |
В сегменті стека |
white |
24 |
|
125 |
В сегменті даних |
gray |
25 |
|
126 |
В сегменті коду до точки входу |
light blue |
1 |
|
127 |
В сегменті коду після команди виходу в ОС |
light green |
2 |
|
128 |
В сегменті коду після безумовного переходу |
light cyan |
3 |
|
129 |
В сегменті стека |
light red |
4 |
|
130 |
В сегменті даних |
light magenta |
5 |
|
131 |
В сегменті коду до точки входу |
yellow |
6 |
|
132 |
В сегменті коду після команди виходу в ОС |
bright white |
7 |
|
201 |
В сегменті коду після безумовного переходу |
black |
8 |
|
202 |
В сегменті стека |
blue |
9 |
|
203 |
В сегменті коду після безумовного переходу |
green |
10 |
|
204 |
В сегменті стека |
cyan |
11 |
|
205 |
В сегменті даних |
red |
12 |
|
206 |
В сегменті коду до точки входу |
magenta |
13 |
|
207 |
В сегменті коду після команди виходу в ОС |
brown |
14 |
|
208 |
В сегменті коду після безумовного переходу |
white |
15 |
|
209 |
В сегменті стека |
gray |
16 |
|
210 |
В сегменті даних |
light blue |
17 |
|
211 |
В сегменті коду до точки входу |
light green |
18 |
|
212 |
В сегменті коду після команди виходу в ОС |
light cyan |
19 |
|
213 |
В сегменті коду після безумовного переходу |
light red |
20 |
|
214 |
В сегменті стека |
light magenta |
21 |
|
215 |
В сегменті коду після безумовного переходу |
yellow |
22 |
|
216 |
В сегменті стека |
bright white |
23 |
|
217 |
В сегменті даних |
black |
24 |
|
218 |
В сегменті коду до точки входу |
blue |
25 |
|
219 |
В сегменті коду після команди виходу в ОС |
green |
1 |
|
220 |
В сегменті коду після безумовного переходу |
cyan |
2 |
|
221 |
В сегменті стека |
red |
3 |
|
222 |
В сегменті даних |
magenta |
4 |
|
223 |
В сегменті коду до точки входу |
brown |
5 |
|
224 |
В сегменті коду після команди виходу в ОС |
white |
6 |
|
225 |
В сегменті коду після безумовного переходу |
gray |
7 |
|
226 |
В сегменті стека |
light blue |
8 |
|
227 |
В сегменті коду після безумовного переходу |
light green |
9 |
|
228 |
В сегменті стека |
light cyan |
10 |
|
229 |
В сегменті коду після безумовного переходу |
black |
8 |
|
230 |
В сегменті стека |
blue |
9 |
|
231 |
В сегменті коду після безумовного переходу |
green |
10 |
|
232 |
В сегменті стека |
cyan |
11 |
|
301 |
В сегменті коду після команди виходу в ОС |
yellow |
15 |
|
302 |
В сегменті коду після безумовного переходу |
bright white |
16 |
|
303 |
В сегменті стека |
black |
17 |
|
304 |
В сегменті даних |
blue |
18 |
|
305 |
В сегменті коду до точки входу |
green |
19 |
|
306 |
В сегменті коду після команди виходу в ОС |
cyan |
20 |
|
307 |
В сегменті коду після безумовного переходу |
red |
21 |
|
308 |
В сегменті стека |
magenta |
22 |
|
309 |
В сегменті коду після безумовного переходу |
brown |
23 |
|
310 |
В сегменті стека |
white |
24 |
|
311 |
В сегменті даних |
gray |
25 |
|
312 |
В сегменті коду до точки входу |
light blue |
1 |
|
313 |
В сегменті коду після команди виходу в ОС |
light green |
2 |
|
314 |
В сегменті коду після безумовного переходу |
light cyan |
3 |
|
315 |
В сегменті стека |
light red |
4 |
|
316 |
В сегменті даних |
light magenta |
5 |
|
317 |
В сегменті коду до точки входу |
yellow |
6 |
|
318 |
В сегменті коду після команди виходу в ОС |
bright white |
7 |
|
319 |
В сегменті коду після безумовного переходу |
black |
8 |
|
320 |
В сегменті стека |
blue |
9 |
|
321 |
В сегменті коду після безумовного переходу |
green |
10 |
|
322 |
В сегменті стека |
cyan |
11 |
|
323 |
В сегменті даних |
red |
12 |
|
324 |
В сегменті коду до точки входу |
magenta |
13 |
|
325 |
В сегменті коду після команди виходу в ОС |
brown |
14 |
|
326 |
В сегменті коду після безумовного переходу |
white |
15 |
|
327 |
В сегменті стека |
gray |
16 |
|
328 |
В сегменті даних |
light blue |
17 |
|
329 |
В сегменті коду до точки входу |
light green |
18 |
|
330 |
В сегменті коду після команди виходу в ОС |
light cyan |
19 |
|
331 |
В сегменті коду після безумовного переходу |
light red |
20 |
|
332 |
В сегменті стека |
light magenta |
21 |
