
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 |