1 / 37

СИСТЕМНЕ ПРОГРАМУВАННЯ

СИСТЕМНЕ ПРОГРАМУВАННЯ. МАКРОПРОЦЕСОРИ. Структури даних макропроцесора. Таблиця макровизначень, строго кажучи, не є таблицею. Це просто масив рядків, у який записуються тексти усіх макровизначень (від оператора  MACRO  до оператора  ENDM ), знайдені у модулі, що обробляється.

dermot
Download Presentation

СИСТЕМНЕ ПРОГРАМУВАННЯ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. СИСТЕМНЕ ПРОГРАМУВАННЯ

  2. МАКРОПРОЦЕСОРИ

  3. Структури даних макропроцесора

  4. Таблиця макровизначень, строго кажучи, не є таблицею. Це просто масив рядків, у який записуються тексти усіх макровизначень (від оператора MACRO до оператора ENDM), знайдені у модулі, що обробляється.

  5. Таблиця імен макровизначень містить імена макровизначень і покажчик на розміщення тексту макровизначення у таблиці макровизначень.

  6. Таблиця глобальних змінних Усі таблиці мають змінний розмір і заповнюються у процесі роботи макропроцесора. При формуванні таблиці унікальних міток використовується індекс унікальних міток - число, за допомогою якого формується унікальна частина імен міток, які зустрічаються у макровизначеннях.

  7. Для обробки кожного макровиклику створюються: • таблиця параметрів, яка містить інформацію про параметри макровизначення; • таблиця локальних змінних, яка містить інформацію про локальні змінні макровизначення. Структура цих таблиць така ж, як і таблиці глобальних змінних. Ці дві таблиці можуть бути об'єднані в одну таблицю параметрів і локальних змінних.

  8.  Таблиця міток макровизначення

  9. Алгоритм роботи макропроцесора Очевидно, що коли макропроцесор обробляє макрокоманду, він вже повинен мати доступ до макровизначення даної макрокоманди. Отже, таблиці макровизначень і імен макровизначень повинні бути створені до початку обробки макровикликів. Тому макропроцесор повинен складатися з двох проходів. На першому проході будуються таблиці макровизначень і імен макровизначень, а на другому здійснюється обробка макровикликів. Якщо макровизначення зосереджені на початку початкового модуля, то макропроцесор може бути і однопрохідним.

  10. Алгоритм роботи двопрохідного макропроцесора. Використано такі передумови: • макропроцесор є незалежним від асемблера; • таблиця параметрів об'єднується з таблицею локальних змінних - у подальшому це таблиця локальних змінних; • сукупність операторів макромови така: MACRO, ENDM, MEXIT, MNOTE, LOCL, GLBL, SET, MGO, MIF; • забезпечуються локальні та глобальні змінні макровизначень, унікальні мітки.

  11. Алгоритм виконання першого проходу макропроцесора • Початок першого проходу макропроцесора. • Ініціалізація: відкриття початкового файлу; створення порожніх таблиць; ознака "обробка макровизначення" встановлюється у FALSE. • Читання наступного рядка початкового файлу з перевіркою кінця файлу. Якщо кінець файлу не знайдено, то виконується перехід до б.

  12. Алгоритм виконання першого проходу макропроцесора • Якщо при читанні рядка знайдено кінець файлу, то виводиться повідомлення про помилку, закриваються файли, звільняється пам'ять. • Перший прохід макропроцесора завершується з ознакою помилки. • Якщо кінець файла не знайдено, то виконується лексичний розбір прочитаного рядка файла з виділенням імені і мнемоніки операції.

  13. Алгоритм виконання першого проходу макропроцесора • Алгоритм макропроцесора розгалужується залежно від мнемоніки операції. • Якщо мнемоніка операції MACRO - заголовок макровизначення, то у таблицю імен макровизначень заносяться ім'я, що знаходиться у цьому операторі, і початкова адреса вільної області у таблиці макровизначень. (При занесенні імені у таблицю імен макровизначень перевіряється, чи містить вона уже таке ім'я. Якщо містить, то маємо помилку). • Оператор MACRO записується у таблицю макровизначень.

  14. Алгоритм виконання першого проходу макропроцесора • Ознака "обробка макровизначення" встановлюється у TRUE. Повернення до б. 3. • Якщо мнемоніка операції ENDM - кінець макровизначення, то оператор записується у таблицю макровизначень. • Ознака "обробка макровизначення" встановлюється у FALSE. Повернення до б. 3. • Якщо мнемоніка операції END - кінець програми, то перевіряється значення ознаки "обробка макровизначення". Якщо значення цієї ознаки FALSE, то виконується перехід до б. 16. • Якщо значення ознаки "обробка макровизначення" є TRUE, тобто, якщо кінець програми зустрівся до закінчення макровизначення, то виводиться повідомлення про помилку, закриваються файли, звільняється пам'ять.

  15. Алгоритм виконання першого проходу макропроцесора • Перший прохід макропроцесора завершується з ознакою помилки. • Якщо ознака "обробка макровизначення" встановлена у FALSE, то виконуються операції завершення. • Закінчується перший прохід макропроцесора. • При будь-якій іншій мнемоніці оператора ("Інші") перевіряється значення ознаки "обробка макровизначення". Якщо ця ознака має значення FALSE, то оператор ігнорується макропроцесором. Повернення до б. 3. • Якщо значення ознаки "обробка макровизначення" є TRUE, то оператор записується у таблицю макровизначень. Повернення до б. 3.

  16. Алгоритм виконання другого проходу макропроцесора • Початок другого проходу макропроцесора. • Початкові установки: відкриття файлів, створення порожніх таблиць тощо. Ознака режиму обробки встановлюється в значення "обробка програми". • Якщо ознака кінця обробки не встановлена, то виконується перехід до б. 6. • Якщо ознака кінця обробки встановлена, виконуються операції завершення. • Робота макропроцесора закінчується. • Виконується розбір рядка. • Перевіряється значення ознаки режиму обробки. Якщо це значення є "обробка програми", то виконується перехід до б. 10.

  17. Алгоритм виконання другого проходу макропроцесора • Якщо значення ознаки режиму обробки є "обробка макровизначення", то перевіряється мнемоніка оператора. Якщо мнемоніка оператора не є ENDM, то виконується повернення до б. 3. • Якщо у режимі обробки макровизначення зустрічається мнемоніка ENDM, то ознака режиму перемикається у значення "обробка програми". Усі інші оператори у режимі обробки макровизначення ігноруються. Повернення до б. 3. • Якщо ознака режиму роботи встановлена у значення "обробка програми", відбувається розгалуження алгоритму залежно від мнемоніки оператора. • При обробці оператора MACRO встановлюється ознака режиму обробки у значення "обробка макровизначення". Повернення до б. 3.

  18. Алгоритм виконання другого проходу макропроцесора • Обробка директиви асемблера END полягає у встановленні ознаки кінця обробки. Перехід до б. 14. • Будь-яка інша мнемоніка ("Інші") шукається в таблиці машиних команд або у таблиці директив асемблера. Якщо мнемоніка не знайдена в жодній з цих таблиць, то виконується перехід до б. 15. • Оператор виводиться у вихідний файл. Повернення до б. 3. • Якщо оператор не є оператором мови асемблера, то передбачається, що це макровиклик, та відповідне мнемоніці ім'я шукається у таблиці імен макровизначень. Якщо воно там є, то виконується перехід до б. 19. • Якщо ім'я не знайдене у таблиці імен макровизначень, то воно шукається у бібліотеках макровизначень. Якщо воно там є, то виконується перехід до б. 18.

  19. Алгоритм виконання другого проходу макропроцесора • Якщо ім'я не знайдене, то виробляється повідомлення про помилку, та керування повертається до б. 3 на читання наступного оператора програми. • Якщо ім'я знайдене у бібліотеках макровизначень, то відповідні елементи включаються у таблицю імен макровизначень і у таблицю макровизначень. • Якщо ім'я є у таблиці макровизначень, то спочатку виконується обробка макровиклику (див. нижче), а потім повернення до б. 3.

  20. Алгоритм обробки макровиклику • Початок обробки макровиклику. На вході цього модуля є номер елемента у таблиці імен макровизначень і розібраний текст оператора макровиклику. • Створення порожніх таблиць: таблиці локальних змінних; таблиці міток. • Читання першого рядка з таблиці макровизначень за адресою, що записана в елементі таблиці імен макровизначень. (Тут і далі слід мати на увазі, що після читання чергового рядка макровизначення покажчик для наступного читання встановлюється на адресу наступного рядка, якщо покажчик не змінений явним чином). • Перевірка параметрів: зіставлення фактичних параметрів виклику з формальними параметрами, які описані у заголовку макровизначення. (Заголовок знаходиться у рядку, тільки-но зчитаному з таблиці макровизначень). Якщо усе гаразд, то виконується перехід до б. 7.

  21. Алгоритм обробки макровиклику • При невідповідності фактичних параметрів до формальних формується повідомлення про помилку. • Обробка макровиклику завершується. • Фактичні параметри і їх значення заносяться до таблиці локальних змінних. • Створюється та заповнюється таблиця міток макровизначення. При цьому текст макровизначення проглядається до оператора ENDM, виявляються мітки, і вони заносяться до таблиці. Перевіряється унікальність міток. Після заповнення таблиці міток покажчик читання з таблиці макровизначень встановлюється на другий (наступний за заголовком) рядок тексту макровизначення. • Читається наступний рядок тексту макровизначення. • Якщо рядок є коментарем асемблера, то перехід до б. 45. • Якщо рядок є коментарем макромови, то повернення до б. 9. • Виконується розбір рядка. • Алгоритм розгалужується залежно від мнемоніки оператора.

  22. Алгоритм обробки макровиклику • При обробці оператора LOCL ім'я локальної змінної шукається спочатку у таблиці локальних змінних... • ... а потім - у таблиці глобальних змінних. • Якщо ім'я знайдене в одній з таблиць (див. б. 14 і б. 15), то формується повідомлення про неунікальне ім'я. Потім повернення до п. 9. • Якщо ім'я не знайдене в жодній з таблиць (див. б. 14 і б. 15), то новий рядок заноситься до таблиці локальних змінних. Потім повернення до б. 9.

  23. Алгоритм обробки макровиклику • Обробка оператора GLBL відрізняється від обробки оператора LOCL тільки тим, що новий рядок створюється у таблиці глобальних змінних. Потім повернення до б. 9. • При обробці оператора SET обчислюється вираз - операнд команди. Обчислення включає в себе підстановку значень змінних, що входять у вираз. Помилки можливі через використання невизначених імен і наявність помилок у синтаксисі виразу. • Ім'я змінної шукається спочатку в таблиці локальних змінних. Якщо його там немає, то виконується перехід до б. 22. • Якщо ім'я знайдене, то змінюється його значення у таблиці локальних змінних. Потім повернення до б. 9. • Якщо ім'я змінної в таблиці локальних змінних не знайдене, то воно шукається в таблиці глобальних змінних. Якщо його там немає, то виконується перехід до б. 24. • Якщо ім'я знайдене в таблиці глобальних змінних, то змінюється його значення у цій таблиці. Потім повернення до б. 9. • Якщо ім'я не знайдене в жодній з таблиць, то формується повідомлення про невизначеність імені. Потім повернення до б. 9.

  24. Алгоритм обробки макровиклику • При обробці оператора MIF обчислюється умовний вираз - перший операнд команди (можливі помилки). • Перевіряється значення обчисленого умовного виразу. Якщо це значення є "хибність", то виконується повернення до б. 9. • Ім'я мітки - другого операнда команди - шукається в таблиці міток макровизначення. Якщо мітка не знайдена у таблиці, то перехід до б. 29. • Якщо мітка знайдена у таблиці, покажчик для наступного читання з таблиці макровизначень встановлюється на адресу відповідної мітки. Потім повернення до б. 9. • Якщо мітка не знайдена у таблиці, то видається повідомлення про невизначену мітку. Потім повернення до б. 9.

  25. Алгоритм обробки макровиклику • При обробці оператора MGO ім'я мітки - операнда команди - шукається у таблиці міток макровизначення. Якщо мітка не знайдена у таблиці, то виконується перехід до б. 32. • Якщо мітка знайдена у таблиці, то покажчик для наступного читання з таблиці макровизначень встановлюється на адресу, що відповідає мітці. Потім повернення до б. 9. • Якщо мітка не знайдена у таблиці, то видається повідомлення про невизначену мітку. Потім повернення до б. 9.

  26. Алгоритм обробки макровиклику • При обробці оператора MNOTE виводиться повідомлення, яке визначається операндом. • Визначається та аналізується код серйозності. Код серйозності є загальним для всієї роботи макропроцесора. Його значення змінюється тільки у випадку, якщо нове значення більше поточного (більш серйозна помилка). Якщо код серйозності допускає продовження роботи макропроцесора, то виконується повернення до б. 9. • Якщо код серйозності не допускає продовження роботи макропроцесора, то встановлюється ознака завершення роботи. Потім повернення до б. 9.

  27. Алгоритм обробки макровиклику • При обробці оператора MEXIT встановлюється та аналізується код серйозності. Якщо код серйозності допускає продовження роботи макропроцесора, то виконується перехід до б. 38. • Якщо код серйозності не допускає продовження роботи макропроцесора, то встановлюється ознака завершення роботи. • Звільняються структури даних, які створені для обробки макровиклику. • Обробка макровиклику завершується. • При обробці оператора ENDM звільняються структури даних, які були створені для обробки макровиклику. • Обробка макровиклику завершується.

  28. Алгоритм обробки макровиклику • Будь-яка інша мнемоніка операції ("Інші") означає, що оператор є не оператором макромови, а оператором мови асемблера. В цьому випадку перш за все перевіряється, чи має оператор мітку, яка має бути унікальною. Якщо оператор не має такої мітки, то перехід до б. 44. • Якщо оператор має таку мітку, то формується ім'я унікальної мітки, і індекс унікальних міток збільшується на 1. • Виконуються підстановки в операторі мови асемблера (значення імен шукаються у таблицях локальних і глобальних змінних, можливі помилки). • Оператор або коментар мови асемблера записується у макророзширення. Повернення до б. 9.

  29. Бібліотеки макровизначень Макровиклики макровизначень, які розміщені у початковому модулі, можуть застосовуватися тільки у цьому ж початковому модулі. Для того щоб можна було використовувати макровизначення у різних початкових модулях, макровизначення треба розмістити у бібліотеці макровизначень. Список бібліотек макровизначень, вміст яких використовується в конкретному початковому модулі, є параметром макропроцесора.

  30. Алгоритми використання бібліотек • Аналіз мнемоніки проводиться на першому проході асемблера. Всі оператори, що не розпізнані як оператори мови асемблера, визнаються макрокомандами, і для них створюються рядки у таблиці імен макровизначень. • Якщо для такої макрокоманди макровизначення ще не знайдене, то поле посилання на таблицю макровизначень залишається порожнім. • Якщо у початковому модулі зустрічається макровизначення, то його текст заноситься у таблицю макровизначень. Якщо у таблиці імен макровизначень вже є це ім'я з порожнім посиланням на таблицю макровизначень, то посиланню присвоюється значення. Якщо такого імені у таблиці імен макровизначень нема, то у таблиці створюється новий рядок.

  31. Алгоритми використання бібліотек • У кінці першого проходу проглядається таблиця імен макровизначень. Якщо у таблиці знаходяться імена з порожніми посиланнями на таблицю макровизначень, то відповідне макровизначення шукається у бібліотеках. Якщо макровизначення знайдене у бібліотеці, то його текст переписується у таблицю макровизначень і присвоюється значення посиланню у відповідному рядку таблиці імен макровизначень. • Якщо після цього у таблиці імен макровизначень залишаються імена з порожніми посиланнями, то це свідчить про помилки у програмі.

  32. Макровизначення усередині макровизначень Необхідність у таких засобах загалом є сумнівною. Вона може виникнути при створенні великого макровизначення, в якому є фрагменти, що повторюються. Вкладене макровизначення дійсне тільки усередині того макровизначення, в яке воно вкладене. Проти такого засобу можна навести два міркування: • макровизначення не буває занадто великим - інакше не спрацьовують його переваги над підпрограмою (слід, однак, визнати, що можуть існувати доволі великі макровизначення, які генерують різні варіанти невеликих макророзширень); • у мові Pascal вкладені процедури допускаються, а у мові C - ні; і C чудово обходиться без них, та й сучасна практика програмування на мові Pascal їх практично не використовує.

  33. Варіант реалізації вкладених макровизначень: • Перший прохід макропроцесора виконується майже за тим самим алгоритмом, який наведено вище. Принципово важливо, однак, що таблиця макровизначень і таблиця імен макровизначень мають послідовну структуру; елементи до них записуються у порядку надходження. • В макропроцесорі є деяка ціла змінна - глибина вкладеності. Її початкове значення є 0. При кожній появі оператора MACRO це значення збільшується на 1, а при кожній появі оператора ENDM- зменшуються на 1. • Якщо при глибині вкладеності 0 з'являється оператор MACRO, до таблиці імен макровизначень заноситься новий елемент, і текст макровизначення записується у таблицю макровизначень доти, поки глибина вкладеності не стане дорівнювати 0. • Поява оператора MACRO при глибині вкладеності, що більше 0, не призводить до створення нового елемента у таблиці імен макровизначень.

  34. Варіант реалізації вкладених макровизначень: • Таким чином, у таблиці імен макровизначень є рядок тільки для самого зовнішнього макровизначення, а усі вкладені макровизначення поки "невидимі" і знаходяться усередині тексту зовнішнього макровизначення у таблиці макровизначень. • Другий прохід макропроцесора при обробці макровиклику зчитує текст макровизначення у деякий буфер і передусім рекурсивно викликає для його обробки макропроцесор. • Для вкладеного виклику макропроцесора доступні таблиця макровизначень і таблиця імен макровизначень. Нові макровизначення, що знайдені рекурсивним викликом, заносяться у кінець цих таблиць. • При поверненні з рекурсивного виклику макровизначення, які дописані ним, видаляються з таблиць.

  35. Структурний асемблер • У вигляді макрокоманд можуть бути реалізовані оператори, які близькі до операторів керування потоком обчислення у мовах високого рівня (умовні оператори, розгалуження, різні види циклів). Відомим прикладом такого розширення є мова макроасемблера BCPL - попередниця мови C.

  36. Об'єктно-орієнтований асемблер • Найпростіше розширення асемблера за рахунок об'єктно-орієнтованих властивостей передбачає введення макрокоманди визначення об'єкта (або резервування пам'яті для об'єкта). У макрокоманді вказується тип об'єкта і вона використовується замість директив DD/BSS. Для типу об'єкта можуть бути створені макрокоманди-операції. У цьому варіанті може бути втілений принцип поліморфізму, оскільки та сама операція може бути допустимою для різних типів. (Наприклад, одна команда додавання для усіх типів - чисел, незалежно від їх розрядності та форми подання). Принцип інкапсуляції реалізується тут у тому сенсі, що програміст, який використовує макрокоманди, не повинен знати внутрішньої структури об'єкта і подробиці виконання операції над ним; захист же внутрішньої структури об'єкта організувати набагато складніше. Є приклади розробок, в яких на рівні макромови створено і засоби опису класів, що включають в себе успадкування класів з усіма витікаючими з цього можливостями.

  37. Машинна мова, яку можна переносити • Макрозасобами може бути забезпечений повнофункціональний набір команд деякої віртуальної машини. Програма пишеться на мові цієї віртуальної машини. Для різних платформ створюються бібліотеки макровизначень, що забезпечують розширення макровикликів у команди даної цільової платформи. Програма, таким чином, стає переносимою на рівні початкового тексту. Оскільки макровизначення може бути побудоване так, щоб генерувати ненадлишковий код для кожного конкретного макровиклику, то програма на мові віртуальної машини не буде поступатися у ефективності перед програмою, одразу ж написаною на мові цільового асемблера.

More Related