Порівняльний аналіз різних систем адресації, що використовуються в міні і мікроЕОМ.
1. ВІДЗНАКИ МІНІ-І мікроЕОМ.
Наприкінці 60-х років почався серійний випуск порівняно невеликих і дешевих
міні-ЕОМ. Їх призначали для підприємств і організацій, де установка
високопродуктивних ЕОМ була економічно невигідною. У їх завдання
спочатку входила автоматизація професійної роботи в різних
організаціях, робота на підприємствах як проблемно-ЕОМ. В
1977-78 році було розпочато випуск сімейства малих ЕОМ (СМ ЕОМ). Їх часто називали
керуючими обчислювальними комплексами, так як вони найчастіше використовувалися
в системах управління різного роду. Однак, СМ 3-ої черги, розроблені в
останні роки відносяться вже до ЕОМ четвертого покоління і мають велику
продуктивність, тому коло їх застосування різко розширився, і їх активно
використовують як автоматизованих робочих місць, об'єднують в
обчислювальні системи, і доручають їм розрахунок економічних і статистичних
завдань. З появою великих інтегральних схем пов'язаний розвиток іншого класу
машин - мікроЕОМ, і, як досягнення цього напрямку - поява потужних
професійних ПЕОМ, які використовуються на робочих місцях для автоматизації
праці, нескладних розрахунків і різного роду проектування. Основною відмінністю
міні-від мікроЕОМ безсумнівно є орієнтація. Машини СМ ЕОМ випускалися як
проблемно орієнтовані ЕОМ і підтримувалися великою кількістю різних
модулів визначають їхню спеціалізацію, в той час як ПЕОМ - це універсальні
ЕОМ, розраховані окрім застосування у професійній діяльності ще й на
застосування в якості навчальних і побутових ЕОМ. За функціональними можливостями
міні-та мікроЕОМ що мають приблизно один і той же рівень не відрізняються один від
одного, як це має бути для машин різного класу, тобто з огляду на що міні-ЕОМ
вважається більш потужною ніж мікроЕОМ, а зокрема ПЕОМ. Для порівняння візьмемо
суперміні-ЕОМ СМ 1700 і сучасну персональну ЕОМ на базі 32-розрядного
процесора.
СМ 1700AMD 80386 DX 40Mhz
Продуктивність, млн.оп./с39.6
Разрядность3232
Ємність ОЗУМбайт5-151-128
Всі дані по процесору AMD386 взяті з документації на Ali 386 MINI ISA System
Board. Як видно з розвитком елементної бази ПЕОМ, задумані як менш потужні,
ніж міні-ЕОМ персональні комп'ютери обігнали їх по продуктивності.
2. Системи адресації ВИКОРИСТОВУЮТЬСЯ У МІНІ-ЕОМ
У цій главі будуть розглянуті способи адресації даних, що використовуються в міні-ЕОМ
на прикладі СМ1700. Це перший представник 32-розрядних ЕОМ сімейства РМ.
Обчислювальний комплекс СМ1700 являє собою універсальну ЕОМ. Одна з
основних цілей його створення - це розширення віртуального адресного простору
в порівнянні з 16-розрядної СМ4. Хоча деякі інструкції обчислювального
комплексу СМ1700 мають схожість з інструкціями СМ4, СМ1700 являє собою
повністю нову архітектуру. Апаратні засоби СМ1700 орієнтовані на
реалізацію мов високого рівня і системних програм, які використовуються
операційною системою і компілятором. Система команд СМ1700 в даний час
включає 304 інструкції і більше 20 режимів адресації операндів. Все це дає
можливість програмісту складати ефективні за обсягом і часу виконання
програми. Які ж способи адресації передбачені в СМ1700? Ми розглянемо
кілька способів адресації, які в загальному можна поділити на регістрові,
непрямі, індексні і спеціальні.
2.1 Реєстрова РЕЖИМ Адресація
У цьому режимі операндом є вміст регістра.Рассмотрім інструкцію MOVL
R2, R3. Для СМ ЕОМ характерно, що приймачем завжди є другий операнд
дво-і третій для трьох-операндних інструкцій. Тому інструкція MOVL R2, R3
пересилає вміст регістру R2 в регістр R3, а не навпаки, як було б з
аналогічною інструкцією MOV AX, BX з набору команд процесорів Сімейство 8086
фірми Intel. Наведемо приклад використання цього способу адресації на прикладі
інструкції MOVL R2, R3. Її машинна запис буде виглядати, як D0 52 53, де D0
- Код інструкції, а 52 і 53 - пряма адресація, 2ой регістр і пряма адресація,
3ий регістр відповідно.
Нехай вміст регістрів до операції було:
R2 = 00000010
R3 = 00001000
Тоді після вони будуть виглядати так:
R2 = 00000010
R3 = 00000010
Як видно з прикладу, вміст регістру R2 було скопійовано в R3.
2.2 ОПОСЕРЕДКОВАНЕ-реєстрових РЕЖИМ
У цьому режимі вміст регістра є адресою операнда. Мнемоніка на
асемблері (Rn), де (Rn) є регістром містять або адреса операнда
джерела (MOVL (R2), R3) або адреса операнда приймача (MOVL R2, (R3)). В
Як приклад знову приведемо інструкцію пересилання подвійного слова MOVL
R2, (R3). Код операції залишиться той же, а операнди будуть представлені як 52 63,
де 63 - це вже непряма адресація з використанням 3го регістра. При тому ж
вмісті регістрів, що і в попередньому прикладі, будемо мати:
До операції MOVL R2, (R3):
R2 = 00000010
R3 = 00001000
(00001000) = 00000200 (R3)
Після ...
R2 = 00000010
R3 = 00001000
(00001000) = 00000010
Після операції пересилання значення комірки пам'яті, адреса якої містився в R3
(00001000) змінився з 000000200 на 00000010.
2.3 РЕЖИМ З АВТОУВЕЛІЧЕНІЕМ
Спеціально для обробки масивів даних у CM1700 передбачена адресація з
автоувуліченіем. У цьому режимі вміст вибраного регістра є адресою
операнда, як ІПРІ побічно-реєстрових адресації, однак після виконання
операції вміст регістра збільшується на N, в залежності від типу операнда:
N = 1, якщо операндом є байт,
N = 2, якщо операндом є слово,
N = 4, якщо операндом є подвійне слово,
N = 8, якщо операндом є учетверенное слово або слово з плаваючою комою,
N = 16, якщо операндом є ціле слово довжиною 128 розрядів або подвійне слово
з плаваючою комою.
Розглянемо цей режим адресації використовуючи команду MOVL (R0), (R2) +. У пам'яті
інструкція буде представлена як D0 60 82, де 60 - як уже говорилося
непряма адресація з регістром R0, а 82 - непряма адресація з використанням
регістра R2 і автоувеліченіе. Вісімка в останньому випадку якраз і означає
даний режим адресації.
До операції MOVL (R0), (R2) +
R0 = 00001000
R2 = 00001050
(00001000) = 000000AC (R3)
(00001050) = 00000000 (R2)
Після ...
R0 = 00001000
R2 = 00001054
(00001000) = 000000AC
(00001050) = 000000AC
Як видно сталася пересилання числа з комірки 00001000 в 00001050 і значення
регістра R2 збільшилося на 4. (Інструкція MOVL пересилає подвійні слова. Про
це говорить суфікс 'L' - Long - довге або подвійне слово. Тому R2
збільшився на 4. Взагалі передбачені операції працюють з байтами, словами,
подвійними словами і іноді з учетвереннимі словами і мають суфікси B, W, L і Q
відповідно.)
2.4 РЕЖИМ З АВТОУМЕНЬШЕНІЕМ
Цей режим ідентичний режиму з автоувеліченіем, однак тут після виконання
операції варто не збільшення, а зменшення операнда за тими ж правилами. Для
прикладу розглянемо команду CLRB - (R5), яка в пам'яті буде виглядати як 94
75. Тут 94 - код операції, а 75 - значить: використовувати регістр R5 (? 5) і
призвести зменшення після виконання (7?).
До операції CLRB - (R5)
R5 = 00001000
(00000FFF) = 0000001A
(000001000) = 0000001A (R5)
Після ...
R5 = 00000FFF
(00000FFF) = 0000001A (R5)
(000001000) = 00000000
Зміни добре видно. Осередок 00001000, на яку спочатку вказував
регістр R5 очистилася (CLRB - CLeaR Byte - очистити байт), значення регістра R5
зменшилася на 1 і тепер вказує на комірку пам'яті розташовану перед осередком
00001000, тобто 00000FFF.
2.5 НЕПРЯМІ РЕЖИМ З АВТОУВЕЛІЧЕНІЕМ
У цьому режимі вміст вибраного регістра є адресою адреси операнда, а
після виконання операції виробляється збільшення вмісту цього регістра на
4, незалежно від розміру операнда. Це визначається тим, що регістр містить
адреса адреси (тобто адресу комірки, вміст якої в свою чергу використовується
як адреса для отримання дійсного операнда), а адреса завжди
представляється як подвійне слово.
Для прикладу візьмемо операцію очищення байти, Мнемоніка якої на асемблері
буде виглядати як CLRB @ (R5) +. Символ '@' (зюха) означає використання не
просто режиму з автоувеліченіем, а саме непрямого. Подання цієї
операції в пам'яті буде 94 95, де 94 - код операції, 95 - означає
використання регістра R5 і непрямої адресації з автоувеліченіем (цифра 9).
До операції CLRB @ (R5) +
R5 = 00001000
(00001000) = 000000AC (R5)
(000000AC) = 0A (00001000)
Після ...
R5 = 00001004
(00001000) = 000000AC
(000000AC) = 00
В результаті виконання цієї команди комірку 000000AC, адреса якої
cодержался в комірці 00001000, на яку вказував регістр R5 обнулені, а
значення регістра R5 збільшилося на 4.
2.6 РЕЖИМ ЗСУВУ
У цьому режимі вміст вибраного регістра складається з вмістом байти,
слова чи подвійного слова, що настає безпосередньо за специфікатором операнда.
Отримана сума є адресою операнда. Мнемоніки на асемблері для 3ех
випадків мають вигляд: B ^ X (Rn), W ^ X (Rn), L ^ X (Rn), де X зсув, відносно (Rn).
Можливість задавати розмірність зміщення передбачена для економії пам'яті.
Розглянемо цей спосіб адресації на прикладі команди CLRB B ^ 2 (R4), яка
очистить 3ий байт байтового масиву, адреса якого міститься в регістрі R5. Її
машинне подання виглядає як 94 A4 02, де 94 - код операції, A4 -
регістр R4 і зсув представлено байтом (для слова та подвійного слова було б
C4 і E4 відповідно, а третє поле являло б зсув як слово або
подвійне слово), а 02 власне зсув, представлене у вигляді байтів.
До операції CLRB B ^ 2 (R4)
R4 = 00001000
(00001000) = 00 (R4)
(00001001) = 01
(00001002) = 02 (R4) 2
Після ...
R4 = 00001000
(00001000) = 00 (R4)
(00001001) = 01
(00001002) = 00
В результаті виконання команди дійсно відбулося очищення осередку
00001002, заданої початковим адресою 00001000 та зміщенням 2. Цей режим
адресації дозволяє легко звертатися до окремих елементів масивів, що дуже
зручно.
2.7 НЕПРЯМІ РЕЖИМ ЗСУВУ
У цьому режимі вміст вибраного регістра складається із зсувом (байт,
слово або подвійне слово наступне безпосередньо за специфікатором операнда) і
отримана сума розглядається як адреса подвійного слова, яке є
адресою операнда. Мнемонічне подання на асемблері @ B ^ X (Rn), @ W ^ X (Rn) і
@ L ^ X (Rn) для зсуву X в байт, слово або подвійне слово відповідно. Rn - це
регістр, що використовується в даному способі адресації.
Як приклад візьмемо інструкцію MOVW @ B ^ 8 (R5), (R2), яка повинна занести
в пам'ять за адресою (R2) число, на яке вказує подвійне слово, за адресою
одержуваному при складанні вмісту регістра R2 із зсувом 8. На машинному
мовою ця інструкція буде мати вигляд B0 B5 08 62, де В0 - код інструкції, B5 -
регістр R5 і байтове зсув, 08 - зміщення і 62 - непряма адресація з
використанням регістра R2.
До операції MOVW @ B ^ 8 (R5), (R2)
R5 = 00001000
R2 = 00000400
(00001000) = 00000100 (R5)
(00001004) = 00000200
(00001008) = 00000300 (R5) +8
(00000300) = AAAA @ (R5) +8
(00000400) = 0000 (R2)
Після ...
R5 = 00001000
R2 = 00000400
(00001000) = 00000100 (R5)
(00001004) = 00000200
(00001008) = 00000300 (R5) +8
(00000300) = AAAA
(00000400) = AAAA
Як видно з прикладу в клітинку 00000400 було занесено комірку 00000300.
Адреса 0000300 був обчислений як вміст R5 (00001000) плюс 8 тобто 00001008.
Ця осередок, як видно, дійсно містить адреса 00000300.
2.8 РЕЖИМ КОРОТКОЇ літерал
Тому що багато літерали (числа), що використовуються в програмах, мають невелику
розмір, то в СМ1700 передбачений спеціальний режим адресації, що називається режимом
короткого літерал. У цьому режимі константа міститься безпосередньо в самому
специфікатор операнда. Будь-який специфікатор операнда, два старших розряду
якого дорівнюють нулю містить літеральную константу в молодших шести розрядах.
00 ??????
літерал
За допомогою літерал в інструкції можуть бути представлені цілі числа в діапазоні
від 0 до 63. Мнемоніка на асемблері S ^ # n, де n - літерал. Розглянемо інструкцію
MOVL S ^ # 18, R3 яка в пам'яті буде представлена у вигляді D0 18 53. Тут D0 -
код інструкції, 18 - літерал, 53 - регістр R3 за прямої адресації.
До операції MOVL S ^ # 18, R3
R3 = 00001234
Після ...
R3 = 00000018
З прикладу видно, що літерал був занесений у регістр R3
2.9 Індексний РЕЖИМ
Одним з найбільш потужних засобів адресації в СМ1700 є використання
регістрів загального призначення для визначення індексу елемента в масиву даних.
Ось формат специфікатор команди:
15 11 7 3 0
КБРА НБР КИР НДР
де КБРА - код базового режиму адресації,
НБР - номер базового регістра,
КИР - код індексного режиму (0100),
НДР - номер індексного регістра.
Як видно розряди 15 - 8 містять друге специфікатор операнда, який
називається базовим. Він може визначати будь-який режим адресації, крім
реєстрового, короткого літерал та індексного. Якщо базовий специфікатор вимагає
розширення, то це розширення слід безпосередньо за специфікатором.
Специфікатор зазвичай визначає адресу початку масиву, а в індексному регістрі Rx
міститься номер елемента масиву. При визначенні ефективного адреси операнда
спочатку обчислюється базовий адреса масиву або таблиці. Потім вміст
індексного регістра множиться на 1, 2, 4 або 8, залежно від розміру
операнда та додається до базового адресою. Використовуючи цей режим адресації
спільно з уже описаними можна отримати наступні режими адресації:
Побічно-регістровий індексний, (Rn) [Rx].
З автоувеліченіем індексний, (Rn) + [Rx].
Непрямий з автоувелічкніем індексний, @ (Rn) + [Rx].
З автоуменьшеніем індексний, - (Rn) [Rx].
Зміщення індексний, N ^ X (Rn) [Rx], де N може приймати значення B, W, L.
Непрямий зміщення індексний, @ N ^ X (Rn) [Rx]
Під час роботи зі структурами даних індексний режим набагато зручніше, ніж просто
режим зсуву. По-перше, тут є потужний режим завдання початкового адреси
масиву за допомогою одного з основних режимів адресації, що дозволяє легко
модифіковані цю адресу. По друге, програміст в індексному регістрі [Rx]
вказує тільки номер елементу, а необхідне зміщення обчислюється
автоматично з контексту операнда. Так, інструкція CLRB B ^ 2 (R4), що реалізує
режим зсуву (пункт 2.6) може виглядати як CLRB (R0) [R4] і якщо в R0
знаходиться адреса масиву, а в R4 зміщення, то вона аналогічно першому інструкції
очистить 3ий елемент масиву.
До операції CLRB (R0) [R4]
R0 = 00001000
R4 = 00000002
(00001000) = 00 (R0)
(00001001) = 01
(00001002) = 02 (R0) + [R4] * 1
Після ...
R0 = 00001000
R4 = 00000002
(00001000) = 00 (R0)
(00001001) = 01
(00001002) = 00
Приклад доводить абсолютну ідентичність цих інструкцій.
2.10 РЕЖИМИ адресації з використання лічильника інструкцій.
Одним з незручностей описаних вище способів адресації є те, що у всіх
них потрібна попередня завантаження одного з регістрів загального призначення.
Тільки після того, як регістр завантажений, вміст його може бути використано
в якості покажчика початку масиву, адреси елемента і т.д. При одноразовому
зверненні до довільній комірці такий спосіб є незручним і неефективним,
так як вимагає по суті виконання двох операцій замість однієї - попередньої
завантаження адреса в регістр і власне звернення до пам'яті через цей регістр з
допомогою одного з режимів адресації. Однак цю операцію можна реалізувати
набагато простіше, якщо використовувати лічильник інструкцій. Регістр R15 є
лічильником інструкцій, і одночасно регістром загального призначення, тобто
доступний програмісту для використання в якості базового регістра і т.д. Це
дуже спрощує життя програмісту, однак вимагає підвищеної уважності, так
як використання цього регістра наприклад при адресації з автоуменьшеніем
призведе до непередбачуваного результату. Фактично з лічильником інструкцій
використовуються тільки чотири режими адресації: з автоувеліченіем, непрямий з
автоувеліченіем, зміщення і непрямий зсуву. Це дає з точки зору
програміста (але не апаратно) чотири додаткових режиму адресації:
безпосередній, абсолютний, відносний і побічно-відносний.
Розглянемо алгоритм виконання режиму з автоувеліченіем при використанні
лічильника інструкцій у якостейе регістра загального призначення. За визначенням режиму
з автоувеліченіем операція проводиться над операндом, на який вказує
вибраний регістр. Якщо ми використовуємо лічильник інструкцій, то він в цей момент
вказуватиме на клітинку безпосередньо наступну за специфікатором операнда.
Таким чином операнд виявляється безпосередньо в потоці інструкцій. Після
вибірки операнда вміст лічильника збільшиться на розмір операнда, обумовлений
кодом операції. Довжина константи повинна відповідати типу інструкції, навіть
якщо її фактичний розмір менше, тільки тоді після автоувеліченія вмісту
лічильника інструкцій він буде містити правильну адресу наступної команди. Для
прикладу розглянемо інструкцію MOVB # 10, (R2)
До операції MOVB # 10, (R2)
00000305: 90 КОП
00000306: 8F
00000307: 10
00000308: 62
R2 = 00001000
R15 = 00000305
(00001000) = FF (R2)
Після ...
R2 = 00001000
R15 = 00000309
(00001000) = 10 (R2)
При компіляції інструкція MOVB # 10, (R2) була замінена на MOVB (R15) + (R2), а
константа була поміщена в потік інструкцій, і була успішно адресована і
скопійована за адресою (00001000).
Якщо використовувати непрямий режим з автоувеліченіем, то за визначенням режиму
вміст лічильника інструкцій є не адресою операнда, а адресою адреси
операнда, а після виконання інструкції значення лічильника збільшиться на 4, так
як ми передаємо 32-розрядні адреси. Таким чином ми маємо можливість поставити
прямо в коді інструкції абсолютний адреса операнда. Якщо в попередньому прикладі
використовувати цей приклад, то за адресою (00001000) буде занесено не число 10, а
значення клітинки 10. На асемблері така інструкція буде мати мнемоніки MOVB
@ # 10, (R2):
До операції MOVB @ # 10, (R2)
00000305: 90 КОП
00000306: 9F
00000307: 10
00000308: 00
00000309: 00
0000030A: 00
0000030B: 62
R2 = 00001000
R15 = 00000305
(00000010) = 00
(00001000) = FF (R2)
Після ...
R2 = 00001000
R15 = 00000309
(00000010) = 00
(00001000) = 00
Є певний клас програм, які називаються позиційно-незалежними.
Вони можуть бути завантажені і запущені в будь-якій області пам'яті без перетрансляціі,
перелінковки або модифікації адрес операндів. При переміщенні в пам'яті
програми, що використовує побічно-регістровий режим адресації адреса адресується
клітинки не змінюється. Якщо дані в пам'яті переміщуються разом з програмою, як
це найчастіше буває, то адресуватися будуть зовсім не ті дані, які повинні
б. Що робити в таких випадках? Розглянемо як використовувати лічильник інструкцій
в режимі зі зміщенням. Вміст регістра лічильника інструкцій складається з
зміщенням, яке розташоване безпосередньо в потоці інструкцій. Отримана
сума є адресою операнда. Очевидно, що в цьому випадку дані будуть
адресуватися правильно, тому що якщо підібрати зсув що дорівнює різниці між
операнда адресою та адресою поточної команди, то ця різниця завжди буде
постійною. Цей режим адресації називається відносним і на асемблері
записується просто як Addr, де Addr - адреса операнда. Розглянемо виконання
інструкції MOVB 10, (R2)
До операції MOVB 10, (R2)
00000305: 90 КОП
00000306: CF
00000307: 07 негативне зміщення (309-10),
00000308: FD представлене в доп. коді
00000309: 62
R2 = 00001000
R15 = 00000305
(00000010) = 00
(00001000) = FF (R2)
Після ...
R2 = 00001000
R15 = 0000030A
(00000010) = 00
(00001000) = 00
Відзначимо, що зміщення у даному прикладі негативне і представлене в
додатковому коді. Довжина зміщення і відповідний конкретний код режиму
обчислюється автоматично на етапі компілювання. Якщо використовувати лічильник
інструкцій в непрямому режимі із зсувом, то отримаємо ще один спосіб
адресації, який називається побічно-відносним. Тут сума вмісту
лічильника інструкцій складається із зсувом і розглядається як адреса адреси
операнда. Для програміста цей режим є просто режимом непрямої
адресації з використанням довільної комірки для зберігання адреси. Як і в
попередньому прикладі зсув має дорівнювати різниці між адресою даної
осередку і поточним положенням інструкції. На асемблері цей режим позначається
@ Addr, де Addr - адреса клітинки, в якій знаходиться адреса операнда. Розглянемо
інструкцію MOVB @ 10, (R2):
До операції MOVB @ 10, (R2)
00000305: 90 КОП
00000306: CC
00000307: 07 негативне зміщення (309-10),
00000308: FD представлене в доп. коді
00000309: 62
R2 = 00001000
R15 = 00000305
(00000000) = EE (00000010)
(00000010) = 00
(00001000) = FF (R2)
Після ...
R2 = 00001000
R15 = 0000030A
(00000000) = EE
(00000010) = 00
(00001000) = EE
2.11 Адресація ПЕРЕХОДІВ.
Останній спосіб адресації, який буде розглянуто - це адресація переходів.
Ось формат інструкції умовного переходу:
7 -------------------------------------------- 0
КОД ОПЕРАЦІЇ
ЗСУВУ
Адресація в цих інструкціях відрізняється від усіх розглянутих тим, що тут
немає специфікатор операнда. Кожна інструкція умовного переходу складається з коду
операції і наступного за ним байтного усунення зі знаком. При формуванні
адреси переходу зсув складається з вмістом лічильника інструкцій подібно
тому, як це робилося при відносній адресації. Чому всього 128 байти? Це
обумовлено тим, що більшість переходів адресовані до осередків, що знаходяться на
невеликій відстані від самої інструкції переходу. Лише в деяких випадках
потрібне використання більш ефективних режимів адресації.
3. СІСТЕМИАДРЕСАЦІІ ВИКОРИСТОВУЮТЬСЯ У ПЕОМ
Системи адресації використовуються в персональних ЕОМ будуть розглянуті на прикладі
32-розрядного процесора 80386 фірми Intel. Все що стосується цього процесора,
системи його команд і способів адресації можна так само віднести до 386-ым
процесорам фірм Cyrix та AMD (Advanced Micro Devices), які повністю
сумісні з I80386. МП 80386 являє собою високопродуктивний
32-розрядний мікропроцесор, що виконує 3-4 Мопс (MIPS). Він відрізняється повною
32-розрядної архітектурою з фізичним адресним остранством 4 Гбайт і
вбудованими засобами сторінкової віртуальної пам'яті, МП 80386 може адресувати
64 Тбайт віртуальної пам'яті. Система команд МП 80386 містить 9 категорій
команд: пересилання даних, арифметичних, зсуву, обробки рядків, обробки
бітів, передачі управління, підтримки мов високого рівня, підтримки
операційної системи та управління процесором. Довжина команди в середньому
складає 2-3 байти. Операнди можуть мати довжину 8,16 або 32 розряди.
МП 80386 реалізує сегментну організацію пам'яті, при якій фізична адреса
комірки обчислюється шляхом додавання базової адреси сегмента і відносного
адреси комірки всередині сегмента. Базовий адреса визначається вмістом
16-розрядного сегментного регістра і залежить від режиму роботи мікропроцесора.
Якщо мікропроцесор працює в режимі обробки 16-розрядних даних (режим
реальних адрес або режим віртуального процесора 8086), то 20-розрядний
базова адреса формується шляхом зрушення вмісту сегментного регістра на
чотири розряду ліворуч. Тобто якщо в сегментному регістрі міститься число 45F7, то
базовий адресу буде 45F70. Якщо мікропроцесор працює в режимі обробки
32-розрядних даних (захищений режим), то 32-розрядний базовий адреса
міститься в дескриптор, вибір якого з таблиці дескрипторів здійснюється
за допомогою селектора - вмісту відповідного сегментного регістра. В
залежно від типу звернення до пам'яті проводиться вибір сегментного регістра і
способу визначення відносного адреси. Для деяких способів звернення до
пам'яті можливі варіанти вибору сегментних регістрів. Ці варіанти можуть бути
вибрані за допомогою префікса заміни сегмента SEG. На мнемоніки асемблера це
виглядає просто як DS :[?], ES :[?], CS :[?], FS: [?] і т.д. Як
відносного адреси використовується вміст регістрів EIP (IP), ESP (SP),
ESI (SI), EDI (DI) або ефективний адреса EA, який формується відповідно до
заданим способом адресації (непрямий, індексний і т.д.).
1. Вибірка команд.
Сегментний регістр CS (Code Segment)
Відносний адреса EIP (IP) (Instruction Pointer)
2. Звернення до стека.
Сегментний регістр SS (Stack Segment)
Відносний адреса ESP (SP) (Stack Pointer)
3. Адресація операнда.
Сегментний регістр DS або (CS, SS, ES, FS, GS)
Відносний адреса EA
4. Адресація елемента рядка-джерела.
Сегментний регістр DS або (CS, SS, ES, FS, GS)
Відносний адреса ESI (SI)
5. Адресація елемента рядка-приймача.
Сегментний регістр ES
Відносний адреса EDI (DI)
6. Адресація операнда з використанням в якості базового регістра EBP (BP) або
ESP (SP).
Сегментний регістр SS або (CS, DS, ES, FS, GS)
Відносний адреса EA
Ефективний адреса операнда EA є 16 - або 32-розрядних і формується в
Залежно від значення певних полів у поданні команди. Загалом
випадку EA утворюється шляхом додавання трьох компонентів:
вміст базового регістра EBP (BP) або EBX (BX);
вмісту індексного регістра ESI (SI) або EDI (DI);
8 -, 16 - або 32-розрядного зсуву, заданого безпосередньо в команді.
різних випадках для формування EA використовуються або всі або частину цих
доданків. Тепер розглянемо конкретні способи адресації.
3.1 безпосередньої адресації.
Як операнда використовується один, два або чотири останні байти команди.
Такий спосіб адресації реалізується при виконанні ряду команд пересилання (MOV,
PUSH), арифметичних операціях (ADD, ADC, SUB, SBB, CMP, IMUL), і логічних
(AND, OR, XOR, TEST). Розглянемо простий приклад - множення вмісту
регістра на константу:
Регістри до виконання IMUL AX, 5
AX = 10
Після ...
AX = 50
3.2 Реєстрова адресації.
При цьому способі адресації операндом береться вміст регістру. Наприклад для
операції занесення на стек реалізація реєстрового способу адресації буде
виглядати як PUSH DS.
Регістри до виконання PUSH DS
DS = 5678h
SP = FFFEh
SS: FFFE = 0000h
Після ...
DS = 5678
SP = FFFDh
SS: FFFD = 5678
SS: FFFE = 0000
Як видно з прикладу значення регістра DS було занесено на стек.
3.3 ОПОСЕРЕДКОВАНЕ-реєстрових адресації.
При такій адресації відносний адреса міститься в індексному (SI, DI, ESI,
EDI) або базовому (BX, BP, EBX, EBP) регістрах або в регістрах загального
призначення EAX, ECX, EDX. Адреса операнда обчислюється як сегмент: зсув.
Зсув представлено ефективним адресою.
Для прикладу розглянемо команду MOV EBX, [EDI], яка пересилає вміст
осередку DS: [EDI] в регістр EBX. (Як розміру операнда береться подвійне
слово - 4 байти.
Регістри до виконання MOV EBX, [EDI]
EBX = 5678h
EDI = 0100h
DS: 0100h = 1221h (edi)
Після ...
EBX = 1221h
EDI = 0100h
DS: 0100h = 1221h
Приклад коментарів не потребує. Число, адреса якого DS: EDI було успішно
занесено в регістр EBX. Регістр DS використовувався за замовчуванням.
3.4 прямої адресації.
При цьому способі адресації зміщення в сегменті до операнда задано у вигляді слова
або подвійного слова в коді команди. Для прикладу візьмемо операцію MOV
EAX, [1994h], що пересилає подвійне слово за адресою DS: 1994 у регістр EAX.
Регістри до виконання MOV EAX, [1994h]
EAX = 0000h
DS: 1994h = 5000h
Після ...
EAX = 5000h
DS: 1994h = 5000h
З прикладу видно, що число, прямо адресований як ds: [1994h] було
скопійовано в заданий регістр.
3.5 БАЗОВА адресації.
Відносний адреса операнда формується при складанні вмісту базового
регістра з безпосереднім зміщенням. Зсув може бути представлено словом
або подвійним словом. Розглянемо інструкцію ADD AX, [BP +10 h], яка до
вмісту регістра AX додає число, адреса якого DS: [BP +10 h ]...< br />
Регістри до виконання ADD AX, [BP +10 h]
AX = 0067h
BP = 0100h
DS: 0100h = 0000h (bp)
DS: 0101h = 0001h
· · · · · ·
DS: 0109h = 0009h
DS: 0110h = 0010h (bp +10 h)
Після ...
AX = 0077h
BP = 0100h
DS: 0100h = 0000h
DS: 0101h = 0001h
· · · · · ·
DS: 0109h = 0009h
DS: 0110h = 0010h
Як видно з прикладу, до вмісту BP було додано 10h і вийшло
зсув 110h, за яким і було взято число, доданої до AX.
3.6 Індексний адресації.
Приблизно теж саме, що і базова адресація, однак тут і використовуються
індексні регістри (SI, DI) і зсув заданий байтом або словом. При
формуванні 32-розрядних адрес, в якості базового або індексного може
використовуватися будь-який з регістрів EAX, ECX, EDX, EBX, EBP, ESI, EDI .. Для
прикладу візьмемо інструкцію MOV WORD PTR ES: [DI +2], AX, яка за адресою
ES: [DI +2] зашле слово з AX.
Регістри до виконання MOV WORD PTR ES: [DI +2], AX
AX = 0099h
DI = 000Dh
ES: 000Dh = 0000h (di)
ES: 000Fh = 0000h (di 2)
Після ...
AX = 0099h
DI = 000Dh
ES: 000Dh = 0000h
ES: 000Fh = 0099h
Адреса осередку ES: 000Fh було пораховано як вміст DI плюс 2 = F. Число 99h з
регістра AX успішно скопійовано в цю комірку пам'яті.
3.7 Базовий-Індексний адресації.
При використанні цього способу відносний адреса утворюється шляхом додавання
вмістом базового (BX, BP) та індексного (SI, DI) регістрів. Наприклад для
операції MOV AX, [BP + SI] ми отримаємо:
Регістри до виконання MOV AX, [BP + SI]
AX = 00AAh
BP = 0100h
SI = 0050h
DS: 0100h = 0001h (bp)
DS: 0150h = 0002h (bp + si)
Після ...
AX = 0002h
BP = 0100h
SI = 0050h
DS: 0100h = 0001h
DS: 0150h = 0002h
Адреса осередку DS: 0150h отриманий шляхом додавання значень регістрів BP і SI, після
чого число з цього осередку пам'яті був завантажений у регістр AX.
3.8 Базовий-Індексний Адресація зі зміщенням.
Це варіант базово індексної адресації, при якому до відносного адресою
додається 8 - або 16-розрядне зсув. Додаткові способи адресації
реалізуються при використанні 32-розрядних адрес, коли задано спеціальне
поле (SIB) в коді команди. Тоді можливі конструкції типу [EAX + EBX],
[EAX + EAX], [ECX + EDX], Як індексного регістру можна використовувати будь-який
регістр крім ESP. Вміст цього регістра множиться на масштабний
коефіцієнт F тобто зсувається вліво на число розрядів 0,1,3 або 4. Значення F
залежить від розміру даних. Для прикладу розглянемо інструкцію MOV
EAX, [EAX + EAX].
Регістри до виконання MOV EAX, [EAX + EAX]
EAX = 0010h
DS: 0010h = 000Ah (eax)
DS: 0020h = 000Bh (eax + eax)
Після ...
EAX = 000Bh
DS: 0010h = 000Ah
DS: 0020h = 000Bh
Базовий адреса береться з EAX, складається із зсувом з EAX і подвійне слово
за адресою DS: 0020h заноситься в EAX.
3.9 Індексний адресації з Масштабування
При використанні цього способу адресації відносний адреса формується при
складання масштабована індексу (вмісту індексного регістра) і
32-розрядного зсуву. Пояснимо ідею масштабування індексу: вміст
індексного регістра множиться на масштабний коефіцієнт, щоб правильно
адресувати дані розміром більше одного байта. Для прикладу розглянемо фрагмент
програми, що здійснює роботу з ланцюжком подвійних-слів.
Start: jmp Begin
Var dd 5 dup (0)
Begin:
mov edi, 2; 1
mov [Var + edi * 4], 12345678h; 2
Змінна Var являє собою масив з 5 32-розрядних слів. У рядку 1 ми
заносимо в індексний регістр 2, маючи на увазі обробку другого елемента масиву,
а далі в рядку 2 ми заносимо в другій елемент число 1234567h. На Паскалі це
виглядало-б як Y [2]: = $ 1234567 Якщо б ми не зробили масштабування, то
число 1234567h було-б занесено за адресою [Y 2], а при масштабування
реальну адресу був обчислений як [Y +2 * 4] тобто [Y 8] і число потрапило "за адресою".
Використання масштабування має величезну роль при роботі з масивами слів
і подвійних слів, позбавляючи програміста від необхідності додаткового
індексування змінних і роботи з подвоєними і учетвереннимі індексами
елементів. Все це за нього виконує процесор, скорочуючи і розмір коду і
швидкість його виконання.
3.10 Базовий-Індексний адресації з Масштабування
Відносний адреса формується складанням масштабована індексу і бази, в
якості якої використовується вміст одного з регістрів
EAX, EBX, ECX, EDX, ESI або EDI. Наведемо приклад такої адресації даних:
Інструкція MOV [EAX + EDI * 4], 666h помістить число 666h за адресою EAX плюс
учетверенное вміст EDI.
Регістри до виконання MOV [EAX + EDI * 4], 666h
EAX = 0100h
EDI = 0002h
DS: 0100h = 000Ah (eax)
DS: 0104h = 000Bh
DS: 0108h = 000Ch (eax + edi * 4)
Після ...
EAX = 0100h
EDI = 0002h
DS: 0100h = 000Ah (eax)
DS: 0104h = 000Bh
DS: 0108h = 0666h
Масштабування дозволило адресувати саме 2-е 32-розрядне слово, а не
записати число 666h за адресою EAX +2 тобто 102h, який потрапляє по середині
двох елементів масиву.
3.11 Базовий-Індексний Адресація із зсувом і Масштабування
Цей спосіб адресаціїі розглянуто у пункті 3.6 при використанні 32-розрядної
адресації. Тому наведемо лише приклад інструкції і опишемо її дії.
Інструкція INC [EAX + EDI * 4 +12345678 h] збільшить на одиницю число, адреса якого
обчислюється, як базовий плюс 32-розрядне зсув 12345678h і плюс
масштабовані за основою 4 індекс, що міститься в реєстрі EDI.
3.12 ЩОДО Адресація
Відносна адресація використовується в мікропроцесорі 80386 при виконанні
багатьох команд управління (умовні та безумовні переходи, виклики підпрограм,
управління циклами і т.д. ), Щоб адресувати комірки пам'яті, яка містить
наступну команду. При цьому способі адреса формується як сума вмісту
регістра EIP (IP) (instruction pointer - покажчик інструкції),
відповідного поточного команді, і 8 -, 16 - або 32-розрядного зсуву,
визначає положення такої команди, щодо поточної. Наприклад
розглянемо операцію безумовного переходу в наведеному фрагменті:
.
.
mov ax, 5
jmp @ 1
sub ax, ax
@ 1: mov bx, ax
.
.
Безумовний перехід буде представлений як JMP 02, тобто на 2 байтів вперед,
після інструкції. SUB AX, AX займає в пам'яті слово, означає перехід буде
переданий на команду MOV BX, AX тобто за адресою CS: IP 2. (Це трохи спрощений
приклад внутрісегментного переходу. Насправді при переходах менш ніж на
128 байт використовується короткий перехід EB?? 90, де?? - Це розмір коду
який треба пропустити + 1 байт. Додатковий байт додається за рахунок
коду 90h наступного за зміщенням. Цей код є код інструкції
NOP (no operation), присутність його нікому не потрібне, але склалося
історично, і більше не виправляти. Байт?? - Це байт із знаком, так що
перехід можливий як вперед, так і назад. А от при переходах більш ніж на 127
байт використовується команда E9???? , Описана вище).
4. ВИСНОВОК. ПОРІВНЯЛЬНИЙ АНАЛІЗ систему адресації ВИКОРИСТОВУЮТЬСЯ У CM1700 І В
ПЕОМ на базі процесора 80386.
У двох попередніх розділах ми навели приклади і описали основні способи
адресації, що використовуються в машинах двох різних родин - міні-та мікроЕОМ.
Звичайно це не все, що можна сказати про системи адресації для комп'ютерів
цих родин, проте основні способи завдання адрес і адресації
операндів були розглянуті і можна спробувати проаналізувати, порівняти і
навести приклади використання тих способів адресації, які були описані.
Для початку, розглянемо найпростіші способи адресації, такі як регістрова,
пряма, безпосередня і короткого літерал. Про реєстрову адресацію
важко написати більше, що вже було написано. Природно, що цей спосіб
адресації підтримується і на СМ1700 і 80386 процесором, як втім взагалі
всіма процесорами сімейства 80х86 і багатьма іншими процесорами, які
мають реєстрову пам'ять. Незважаючи на простоту цього способу адресації, він
досить часто використовується для маніпуляції регістрами, їх очі