You are on page 1of 18

Міністерство освіти і науки України

Національний технічний університет України


«Київський політехнічний інститут»

Інститут Прикладного системного аналізу


Кафедра Системного проектування

Лабораторна робота №4

з дисципліни «Архітектура обчислювальних систем»

«Дослідження адресації даних в «реальному режимі»

Виконав:
студент групи ДА-91
факультету «ІПСА»
Сєров І.С.
Варіант 19

Київ – 2021
Завдання
Частина 1. Адресація в «реальному» режимі.
1. Скласти схему обчислення адресу процесорів архітектури х86.
2. Пояснити призначення регістрів ЦПУ, використовуваних для
адресації.
Частина 2. Дослідження способів адресації даних:
1. Визначити склад і пояснити призначення засобів обчислення адресу
даних.
2. Перерахувати способи адресації даних і пояснити їх особливості.
3. Скласти схеми обчислення адресу для різних способів адресації
даних.
Частина 3. Написати і відлагодити програму, що виконує дії, вказані в
таблиці. Для адресації елементів масиву використовувати непрямі режими
адресації. Програма має містити процедуру, яка обробляє вихідні
параметри зі стеку. Навести приклади використання різних способів
адресації даних і команд в програмі, зафіксувавши вміст відповідних
регістрів і адрес пам’яті.
Варіант Завдання

19 Заданий масив слів. Відсортувати масив за збільшенням.


Теоретична частина
Логічний адрес – це адрес, з яким, зазвичай, оперує програмне
забезпечення, формується він з двох величин. Перша – це 16-бітний
селектор (вказівник) сегменту (береться з відповідного операції
сегментного регістру), друга – 32(16)-бітне зміщення відносно початку
сегменту. Логічна адреса існує лише всередині процесору та має зміст для
програмного забезпечення. Його перетворення у фізичний адрес для
звертання до пам’яті забезпечується за допомогою достатньо складного
механізму, функціонування якого суттєво залежить від поточного режиму
роботи процесора.
Програми можуть використовувати різні методи адресації (методи
формування логічного адресу). В загальному випадку ці методи можна
поділити на прямі та непрямі. Вони відрізняються способом задання
32(16)-бітного зміщення. Зміщення може задаватись в коді програми
безпосередньо 32(16)-бітним значенням (пряма адресація), або шляхом
вказівки на регістр (регістри), значення в якому є зміщенням (непряма
адресація). Всі можливі способи формування 32-бітного зміщення
представляються формулою:

Зміщення (offset) = Base + Index* scale + Displacement


Рис. 1 Методи формування зміщення
Лінійний адрес – адрес, який формується механізмом адресації
процесору з логічного адресу. Лінійний адрес призначений для звертання
к лінійному (неперервному і несегментованому) адресному простору
об’ємом 232 байт.
Спосіб формування лінійного адресу з логічного залежить від поточного
режиму роботи процесора (реальний, захищений, 32 або 16-бітова
адресація).
Фізичний адрес – адрес, який передається на зовнішню шину для
звертання до комірок пам’яті.

Реальний режим – режим, в якому працював процесор 8086. У сучасних


процесорах цей режим підтримується в основному для сумісності з старим
програмним забезпеченням. Механізм формування лінійного адресу в
реальному режимі роботи:

Рис. 2 Формування лінійного адресу в реальному режимі роботи


процесора
Отриманий такий чином лінійний адрес є фактично і фізичним адресом.
Опис регістрів загального призначення:

Сегментні регістри. В реальному режимі роботи процесор може апаратно


поділяти програму у пам’яті на 3 частини, які назвали сегментами, а
сегментні регістри призначені для доступу до цих сегментів:
Регістри флагів та вказівників команд:

Опис прапорів:
Системні регістри. Використовуються для забезпечення роботи
захищеного режиму мікропроцесора, тому не часто використовуються
програмістами.

Команди пересилки. Існують дві основні команди пересилки – MOV та


XCHG. Команда MOV має наступний синтаксис:
MOV destination , sourse
За допомогою команди MOV можна пересилати значення з джерела в
приймач. Незважаючи на назву «move», команда копіює з джерела у
приймач, а не переміщає.
Тому можливі лише наступні поєднання операндів у команді mov:

mov register, register


mov register, memory
mov register, operand
mov memory, operand

operand – це просто константа (число), яка може буди представлена ім’ям,


визначеним за допомогою операндів EQU або =.
Пересилка типу пам’ять-пам’ять неможлива. Виключеннями у
представлених поєднаннях також є те, що неможна пересилати данні з
одного сегментного регістру в інший та записувати безпосередній операнд
у сегментний регістр – для цього потрібно використовувати проміжні
несегментовані регістри.
Приклади:
Запис у квадратних дужках, наприклад [00504032h] означає те, що
потрібно взяти значення з пам’яті яке міститься за адресом 00504032h.
Приклад комірок пам’яті:

Відповідно до рисунку команда mov eax, [00504032h] помістить у регістр


EAX подвійне слово (32-розряди) з пам’яті починаючи з адресу 504032h.
Після виконання команди, регістр EAX буде містити значення 725E7A25h,
тобто дані з пам’яті 72h 5Eh, 7Ah, 25h. Дані у пам’яті зберігаються у
зворотньому вигляді відповідно до правилу «молодший байт до
молодшого адресу», тому в EAX буде занесено саме значення 725E7A25h,
а не 257A5E27h.
Якщо у команді не вказувати квадратні дужки, то в EAX буде просто
занесено значення 00504032h.
В команді mov також можна використовувати регістр як комірку пам’яті,
якщо використати квадратні дужки:

Команда MOV не змінює жодні флаги.


Часто у програмах необхідно переставляти місцями якісь дві величини,
для такого існує спеціальна команда
XCHG операнд1, операнд2
Приклади:

Оператор PTR. За допомогою оператору PTR можна уточнити тип


змінної.
Цей оператор має наступний синтаксис:
тип PTR вираз

Тип може бути представлений ім’ям або значенням з наступної таблиці:

Способи адресації.
1. Безпосередня адресація.
Операнд вказується безпосередньо у полі команди, наприклад:
mov ax, 312; 312 задається безпосередньо
2. Регістрова адресація.
Операнд знаходиться в одному з регістрів. Наприклад, обидва операнди у
команді
mov ds, dx
задаються за допомогою регістрового способу адресації.
3. Непряма адресація.
Адрес операнду знаходиться в одному з регістрів – SI, DI, BX, BP.
Наприклад, команда
mov ax, [si]
поміщує у регістр AX слово з комірки пам’яті, зміщення якої вказано у
регістрі SI. Другий операнд заданий за допомогою непрямої адресації. У
сучасних поколіннях процесорів для використання непрямої адресації
можна також використовувати регістри EAX, EBX, ECX, EDX, ESI, EBP
та ESP.
4. Пряма адресація.
Абсолютний адрес операнду можна задати у вигляді
СЕГМЕНТ:ЗМІЩЕННЯ, де СЕГМЕНТ – адрес сегменту на який вказує
якийь сегментний регістр (CS, DS, SS або ES), а ЗМІЩЕННЯ – адрес
операнду відносно сегментного регістру (відносна адреса)
Приклади:

5. Базова адресація
Адрес операнду формується складанням вмісту базового регістру (BP або
BX) та зміщенням. Якщо зміщення не задано, то розуміється нульове
значення зміщення.
Якщо використовується BP, то адрес відповідного операнду
відраховується відносно сегменту, на який вказує регістр SS.
Якщо використовується BX, то адрес відраховується відносно сегменту, на
який вказує регістр DS.
Наприклад, команда:
поміщує у регістр AX слово, яке знаходиться у сегменті, вказаному в DS,
зі зміщенням на два більше, ніж число з BX.
Базова адресація має багато альтернативних форм. Таким чином,
еквівалентними формами є:

6. Індексна адресація
Цей метод адресації схожий на попередній, тільки адрес операнду
формується складанням вмістимого індексного регістру (SI або DI) та
зміщення.
У індексній адресації можна використовувати множник 1, 2,4, або 8 щоб
прочитати елемент рівний відповідно – байту, слову, подвійному слову,
або четвірному слову. Це називається масштабуванням індексного
регістру.
Приклади:

7. Базова-індексна адресація.
Адрес операнду формується складанням вмістимого базового регістру (BP
або BX) та індексного регістру (SI або DI), зі зміщенням, якщо воно
вказано.
Якщо використовується регістр BP, то адрес відраховується відносно
сегменту, на який вказує регістр SS. В іншому випадку цей адрес
відраховується відносно сегменту, на який вказує регістр DS.
Приклади:
8. Адресація за базою з індексацією та масштабуванням.
Це загальна схема адресації, в яку входять всі випадки, які були розглянуті
попередньо як часткові. Адрес формується як сума зміщення, бази та
індексу, причому сума може бути скорегована за допомогою масштабного
множника:

Практична частина

Задаємо масив даних і його розміри, а також рядки для виводу тексту:

Оголосимо функцію для виводу даних:


А також безпосередньо функцію сортування бульбашкою:

Отримаємо наступний результат:


Демонстраційна програма:
%include "io.inc"
section .data
Array dd 10b, 110b, 101b, -100b, -1101b, -1b, -10b, 11111b
N dd ($-Array)/4
aszSource db "Source array:", 0Dh, 0Ah, 0
aszResult db 0Dh, 0Ah, "Result array:", 0Dh, 0Ah, 0
section .text
global CMAIN
CMAIN:
mov ebp, esp; for correct debugging
;write your code here
PRINT_STRING aszSource
lea esi, [Array]
mov ecx, [N]
call ShowArray
lea esi, [Array]
mov ecx, [N]
call BubbleSort
PRINT_STRING aszResult
lea esi, [Array]
mov ecx, [N]
call ShowArray
xor eax, eax
ret
ShowElement:
PRINT_DEC 4, eax
PRINT_CHAR ' '
ret
ShowArray:
.for:
lodsd
push ecx
call ShowElement
pop ecx
loop .for
ret
; esi - адресв масиву
; ecx - кількість елементів в масиві
BubbleSort:
push eax
push ebx
push ecx
push edx
push esi
push edi
;настройка для строковых операций
cld
;получение адреса N-го элемента массива
dec ecx
lea esi, [ecx*4+esi]
mov edx, esi ;edx - адрес a[N]
I:
mov esi, edx
push ecx
J:
mov eax, [esi]
cmp eax, [esi-4]
jge @@J
push dword [esi-4]
mov [esi-4], eax
pop dword [esi]
@@J:
sub esi, 4
loop J
pop ecx
loop I
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
Висновки
Виконуючи лабораторну роботу №4, було вивчено різни методи
адресації процесорів архітектури х86.
Було досліджено та визначено склад та призначення засобів
обчислення адресу. Розібрано всі відомі види адресації та їх програмна
реалізація. Практично було розглянуто декілька видів адресації та
побудовано демонстраційну програму для знаходження середнього
арифметичного заданого масиву значень.

You might also like