Полтавський Військовий Інститут Зв’язку
Кафедра схемотехніки радіоелектронних систем
Програмне забезпечення мікропроцесорних систем.
Програмування універсальних мікропроцесорів на мовах Асемблер.
Система команд МП IA-32.
Лекція обговорена і схвалена на засіданні
предметно-методичної комісії
Протокол № ____ від ________
Полтава – 2006
Навчальна література
1. Юров В. Assembler -- СПб: Издательство „Питер”, 2001, с. 57-66.
2. Мікропроцесорна техніка: Підручник/ Ю.І. Якименко та інш. – К.: ІВЦ Політехніка; Кондор, 2004. с. 49-53, 105-118.
ВСТУП
Як і вся інформація, що збережена в пам'яті ЕОМ, команди подаються двійковим кодом. Як говорилося раніше, двійкове подання інформації є оптимальним для ЕОМ, але незручно для сприйняття людиною. Тому при програмуванні МП застосовується мова асемблер, а для подання адресної інформації (а по більшій частині і для подання даних) використовується шістнадцяткова система числення. Однак, шістнадцяткові коди команд також не занадто зручні для запам'ятовування, тим більше, що в деяких випадках та сама команда може мати різне шістнадцяткове подання. Тому система команд МП представляється у вигляді мнемокодів асемблера.
По-справжньому вирішити проблеми, зв'язані з апаратурою (або навіть, більш того, що залежать від апаратури як, наприклад, підвищення швидкодії програми), неможливо без знання асемблера.
Програміст або будь-який інший користувач може використовувати будь-які високорівневі засоби, аж до програм побудови віртуальних світів і навіть не підозрювати, що насправді комп'ютер виконує не команди мови, на якій написана його програма, а їхнє трансформоване (а точніше, відтрансльоване) подання у формі послідовності команд зовсім іншої мови - машинної. А тепер уявимо, що в такого користувача виникла нестандартна проблема. Наприклад, його програма повинна працювати з деяким незвичайним пристроєм або виконувати інші дії, що вимагають знання принципів роботи апаратури комп'ютера. І отут без знання асемблера не обійтися. І не випадково практично всі компілятори мов високого рівня містять засоби зв'язку своїх модулів з модулями на асемблері або підтримують вихід на асемблерний рівень програмування.
Програми, написані мовою асемблер, вимагають значно меншого обсягу пам'яті і часу виконання в порівнянні з програмами, написаними на будь-якій мові високого рівня. Саме тому асемблер широко використовується при створенні системних програм, особливо драйверів різних пристроїв, основними вимогами до яких є висока швидкодія і компактність.
Знання мови асемблер і результуючого машинного коду дає розуміння архітектури ЕОМ, що не забезпечується при програмуванні мовою високого рівня. Мови високого рівня створювалися для того, щоб програмувати переважно без обліку технічних особливостей конкретних комп'ютерів, асемблер же орієнтований саме на специфіку комп'ютера або, точніше, на специфіку процесора. Мікропроцесори, що належать до різних сімейств, мають, відповідно, свої, системи команд, що істотно розрізняються.
Програмування на асемблері -- це дуже трудомісткій, потребуючий великої уваги і практичного досвіду процес. Тому реально на асемблері пишуть, в основному програми, що повинні забезпечити ефективну роботу з апаратною частиною. Іноді на асемблері пишуться критичні за часом виконання або витратами пам'яті ділянки програми. Згодом вони оформляються у вигляді підпрограм і сполучаються з кодом на мові високого рівня.
На попередніх лекціях (тема 6) ми з’ясували особливості реального та захищеного режимів роботи МП, розглянули принцип формування адреси пам’яті МП архітектури IA-32 у реальному та захищеному режимах. Для створення ефективних та компактних програм існує достатньо широкий вибір типу адресації операндів. Розвинута система команд в свою чергу дозволяє програмісту складати практично будь-які системні та прикладні програми, використовуючи мнемокоди асемблера.
1.Типи адресації операндів МП IA-32.
Існують такі способи адресації:
Пряма адресація.При такій адресації адреса операнда вказана безпосередньо в команді.
Непряма адресація. При такій адресації у форматі команди вказується номер (ім’я) регістра, у якому зберігається адреса комірки пам’яті, яка містить операнд.
Безпосередня адресація.У першому байті команди з безпосередньою адресацією розміщується код операції. Значення операндів заносяться в команду під час програмування і знаходяться у другому і третьому байтах. Цими значеннями зазвичай є деякі константи. У процесі виконання програми значення операндів залишаються незмінними, оскільки вони разом із командою розміщуються в ПЗП. Використання такого способу не потребує адреси операндів.
Автоінкрементна (автодекрементна) адресація.Адреса операнда обчислюється так само, як і при непрямій адресації, а потім здійснюється збільшення вмісту регістра: на один-для звернення до наступного байта, на два – для звернення до наступного слова. Розмір операнда визначається кодом операції.
Сторінкова адресація. Під час використання сторінкової адресації пам'ять поділяється на ряд сторінок однакової довжини. Адресація сторінок здійснюється або з програмного лічильника, або з окремого регістра сторінок. Адресація пам'яті всередині сторінок здійснюється адресою, що міститься в команді.
Індексна адресація. Для утворення адреси операнда до значення адресного поля команди додається значення вмісту індексного регістра (SI або DI), яке називається індексом.
Відносна адресація. При відносній адресації адреса операнда визначається додаванням вмісту програмного лічильника або іншого регістра із зазначеним у команді числом.
Базова адресація. Ефективна адреса операнда ЕА обчислюється складанням вмісту базових регістрів ВХ або ВР і зміщенням (8- або 16-розряднє число).
Базова-індексна адресація.Ефективна адреса операнда ЕА дорівнює сумі вмісту базових регістрів ВХ або ВР, індексних регістрів SI або DI та зміщення. Базова та індексна адресація застосовуються для звернення до елементів одновимірного масиву, Базова – індексна – до двовимірного масиву.
Дотепер ми вживали терміни "виконавча (або ефективна) адреса" і "внутрішньосегментний зсув" як синоніми, що є вірним лише для єдиного, найпростішого режиму адресації, що називається прямою адресацією. У дійсності ж система команд МП ІA‑32 передбачає 11 режимів адресації, у більшості з яких зсув є лише одним з компонентів, використовуваних для обчислення ефективної адреси. При цьому тільки в двох випадках операнди не зв'язані з пам'яттю. Це операнд - вміст регістра, що береться з будь-якого регістра процесора і безпосередній операнд, що утримується в самій команді. Інші дев'ять режимів так чи інакше звертаються до пам'яті.
При звертанні до пам'яті ефективна адреса ЕА обчислюється по формулі:
EA = Base +Index* Scale +Disp
з використанням наступних компонентів:
- Зсув (Dіsplacement або Dіsp) - 8, 16 або 32-бітне число, включене у команду;
- База (Base) - вміст базового регістра. Звичайно використовується для вказівки на початок деякого масиву;
- Індекс (Іndex) - вміст індексного регістра. Звичайно використовується для вибору елемента масиву;
- Масштаб (Scale) - множник (1, 2, 4 або 8), зазначений у коді інструкції. Цей елемент використовується для вказівки розміру елемента масиву, доступний тільки при 32-бітній адресації.
Окремі доданки в цій формулі можуть бути відсутніми.
Обчислення ефективної адреси пояснюється схемою, представленої на рис. 1. Можливі режими адресації представлені в таблиці 1.
Процесори ІA-32 можуть працювати з 32-бітною або 16-бітною адресацією. 16-бітна адресація функціонує так само, як у МП І8086, при цьому як компоненти адреси використовуються молодші 16 біт відповідних регістрів. Як говорилося вище, у реальному режимі за замовчуванням використовується 16-бітна адресація, однак є можливість для поточної інструкції переключитися на 32-бітну. При 32-бітній адресації застосовуються розширені 32-розрядні регістри і додаткові режими з масштабуванням індексу. Однак значення ефективної адреси, що обчислюється, усе рівно не може вийти за 64-килобайтний бар'єр - при спробі використання ЕА, що виходить за межу сегмента генерується виключення #GP (General Protectіon Fault).
ЕА
Рис. 1. Обчислення ефективної адреси
Таблиця 1
Режим | Адреса |
Пряма адресація | EA = Disp |
Непряма регістрова адресація | EA = Base |
Базова адресація | EA = Base +Disp |
Індексна адресація | EA = Index +Disp |
Масштабована індексна адресація | EA = Index* Scale +Disp (*) |
Базово-індексна адресація | EA = Base +Index |
Масштабована базово-індексна адресація | EA = Base +Index* Scale (*) |
Базово-індексна адресація зі зсувом | EA = Base +Index +Disp (*) |
Масштабована базово-індексная адресація зі зсувом | EA = Base +Index* Scale +Disp |
(*)- масштабування індексу можливо тільки при 32-бітній адресації.
Нагадаємо, у цій ситуації при 16-бітній адресації просто ігнорується перенос у розряд А16 і сегмент "звертається в кільце".
Засоби контролю стежать і за переходом через границю сегмента під час звертання до "прикордонної" адресі. При спробі адресації до слова, що має зсув FFFF16 або до подвійного слову зі зсувом FFFD16 - FFFF16 (їх старші байти виходять за межу сегмента), або виконання інструкції, хоча б один байт якої не уміщається в даному сегменті, процесор також виробляє виключення #GP.