ПРОЦЕДУРИ І МАКРОКОМАНДИ

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
УІ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Практична робота (завдання)
Предмет:
Системне програмування та операційні системи

Частина тексту файла (без зображень, графіків і формул):

системне програмування Практична робота №5 ПРОЦЕДУРИ І МАКРОКОМАНДИ ПРОЦЕДУРИ ТА ОПЕРАТОР CALL Процедура – це частина програми, яка може бути описана в довільному місці і містити дії над довільними даними. Процедура починається директивою PROC та завершується директивою ENDP. Кодовий сегмент може містити будь-яку кількість процедур, що розділяються директивами PROC і ENDP. Типова організація багато процедурної програми приведена нижче. Виклик процедури здійснюється командою CALL. Для повернення з процедури використовується команда RET.  Виклик процедур. Варто зауважити наступні особливості: - директиви PROC по мітках B10 і C10 мають операнд NEAR для вказівки того, що ці процедури знаходяться в поточному кодовому сегменті. У багатьох випадках, цей операнд опускається, тому що за замовчуванням асемблер приймає тип NEAR. - Кожна процедура має унікальне ім'я і містить власну директиву ENDP для вказівки кінця процедури. - Для передачі керування в процедурі BEGIN маються дві команди: CALL B10 і CALL C10. У результаті першої команди CALL керування передається процедурі B10 і починається її виконання. Досягши команди RET, керування повертається на команду безпосередньо наступну за CALL B10. Друга команда CALL діє аналогічно - передає керування в процедуру C10, виконує її команди і повертає керування по команді RET. - Команда RET завжди виконує повернення у вихідну програму. Програма BEGIN викликає процедури B10 і C10, що повертають керування назад у BEGIN. Для виконання самої програми BEGIN операційна система DOS викликає її, і наприкінці виконання команда RET повертає керування в DOS. Якщо процедура B10 не містить завершальної команди RET, то виконання команд продовжиться з B10 безпосередньо в процедурі C10. Якщо процедура C10 не містить команди RET, то будуть виконуватися команди, що йдуть за процедурою C10 з непередбаченим результатом. Використання процедур дає гарну можливість організувати логічну структуру програми. Крім того, операнд для команди CALL можуть мати значення, що виходять за межі від -128 до +127 байт. Технічно керування в процедуру типу NEAR може бути передане за допомогою команд переходу чи навіть звичайним порядковим кодуванням. Але в більшості випадків рекомендується використовувати команду CALL для передачі керування в процедуру і команду RET для повернення. МАКРОЗАСОБИ Для кожної закодованої команди асемблер генерує одну машинну команду. Але для кожного закодованого оператора компіляторної мови Pascal чи C генерується один чи більш (частіше багато) команд машинної мови. У цьому відношенні можна вважати, що компіляторна мова складається з макрооператорів. Асемблер ТASM також має макрозасоби, але макроси тут визначаються програмістом. Для цього задається ім'я макросу, директива MACRO, різні асемблерні команди, що повинний генерувати даний макрос і для завершення макровизначення - директива ENDМ. Потім у будь-якім місці програми, де необхідне виконання визначених у макрокоманді команд, досить закодувати ім'я макросу. У результаті асемблер згенерує необхідні команди. Використання макрокоманд дозволяє: - спростити і скоротити вихідний текст програми; - зробити програму зрозумілішою; - зменшити кількість можливих помилок кодування. Прикладами макрокоманд можуть бути операції вводу-виводу, пов’язані з ініціалізацією регістрів і виконання переривань, перетворення ASCII і двійкового форматів даних, арифметичні операції над довгими полями, обробка рядкових даних, ділення за допомогою віднімання. Просте макровизначення Макровизначення повинне знаходитися до визначення сегмента. Розглянемо приклад простого макровизначення по імені INIT1, що ініціалізує сегментні регістри для EXE-програми: Директива MACRO вказує асемблеру, що наступні команди до директиви ENDM є частиною макровизначення. Ім'я макрокоманди - INIT1, хоча тут можливі інші правильні унікальні асемблерні імена. Директива ENDM завершує макровизначення. Сім команд між директивами MACRO і ENDM складають тіло макровизначення. Імена, на які є посилання в макровизначенні, CSEG, DSEG і STACK повинні бути визначені де-небудь в іншому місці програми. Макрокоманда INIT1 може використовуватися в кодовому сегменті там, де необхідно ініціалізувати регістри. Коли асемблер аналізує команду INIT1, він спочатку переглядає таблицю мнемокодів і, не знайшовши там відповідного елемента, перевіряє макрокоманди. Оскільки програма містить визначення макрокоманди INIT1 асемблер підставляє тіло макровизначення, генеруючи необхідні команди - макророзширення. Програма використовує розглянуту макрокоманду тільки один раз, хоча є інші макрокоманди, призначені для будь-якої кількості застосувань і для таких макрокоманд асемблер генерує однакові макророзширення. Використання параметрів у макрокомандах У попереднім макровизначенні були потрібні фіксовані імена сегментів: CSEG, DSEG і STACK. Для того, щоб макрокоманда була більш гнучкою і могла приймати будь-як імена сегментів, визначимо ці імена, як формальні параметри: INIT2 MACRO CSNAME,DSNAME,SSNAME ; Формальні параметри ASSUME CS:CSNAME,DS:DSNAME,SC:SSNAME,ES:DSNAME PUSH DS SUB AX,AX PUSH AX MOV AX,DSNAME MOV DS,AX MOV ES,AX ENDM ;Кінець макровизначення Формальні параметри в макровизначенні вказують асемблеру на відповідність їхніх імен будь-яким аналогічним іменам у тілі макровизначення. Усі три формальних параметри CSNAME, DSNAME і SSNAME зустрічаються в директиві ASSUME, а параметр DSNAME ще й у наступній команді MOV. Формальні параметри можуть мати будь-які правильні асемблерні імена, що не обов'язково збігаються іменами в сегменті даних. Тепер при використанні макрокоманди INIT2 необхідно вказати як параметри дійсні імена трьох сегментів у відповідній послідовності. Наприклад, наступна макрокоманда містить три параметри, що відповідають формальним параметрам у вихідному макровизначенні: Макровизначення: INIT2 MACRO CSNAME, DSNAME, SSNAME (формальні параметри) Макрокоманда: INIT2 CSEG, DSEG, STACK (параметри) Оскільки асемблер уже визначив відповідність між формальними параметрами й операторами в макровизначенні, то тепер йому залишається підставити параметри макрокоманди в макророзширенні: Параметр 1: CSEG ставиться у відповідність з CSNAME у макровизначенні. Асемблер підставляє CSEG замість CSNAME у директиві ASSUME. Параметр 2: DSEG ставиться у відповідність з DSNAME у макровизначенні. Асемблер підставляє DSEG замість двох DSNAME: у директиві ASSUME і в команді MOV. Параметр 3: STACK ставиться у відповідність з SSNAME у макровизначенні. Асемблер підставляє STACK замість SSNAME у директиві ASSUME. Макровизначення з формальними параметрами і відповідні макророзширення приведені на мал.рис.3. Формальний параметр може мати будь-яке правильне асемблерне ім'я (включаючи ім'я регістра, наприклад, CX), що у процесі асемблювання буде замінено на параметр макрокоманди. Звідси випливає, що асемблер не розпізнає реєстрові імена й імена, визначені в області даних, як такі. В одній макрокоманді може бути визначене будь-яке число формальних параметрів, розділених комами, аж до 120 стовпчика в рядку. Використання макрокоманд у макровизначеннях Макровизначення може містити посилання на інше макровизначення. Розглянемо просте макровизначення DOS21, що заносить у регістр AH номер функції DOS і виконує INT 21H: DOS21 MACRO DOSFUNC MOV AH,DOSFUNC INT 21H ENDM Для використання даної макрокоманди при введенні з клавіатури необхідно закодувати: LEA DX,NAMEPAR DOS21 0AH Припустимо, що є інше макровизначення, яке використовує функцію 02 у регістрі AH для виводу символу: DISP MACRO CHAR MOV AH,02 MOV DL,CHAR INT 21H ENDM Для виводу на екран, наприклад, зірочки досить закодувати макрокоманду DISP '*'. Можна змінити макровизначення DISP, скориставшись макрокомандою DOC21: DISP MACRO CHAR MOV DL,CHAR DOS21 02 ENDM Тепер, якщо закодувати макрокоманду DISP у виді DISP '*', то асемблер згенерує наступні команди: MOV DL,'*' MOV AH,02 INT 21H . Коментарі у макрокомандах Для пояснень призначення макровизначення в ньому можуть знаходитися коментарі. Директива COMMENT чи символ крапка з комою вказують на рядок коментаря, як це показано в наступному макровизначенні PROMPT: PROMPT MACRO MESSGE ; Ця макрокоманда виводить повідомлення на екран MOV AH,09H LEA DX,MESSGE INT 21H ENDM Оскільки, за замовчуванням у лістінг попадають тільки команди, що генерують об'єктний код, то асемблер не буде автоматично видавати і коментарі, що є в макровизначенні. Якщо необхідно, щоб у розширенні з'являлися коментарі, варто використовувати перед макрокомандою директиву .LALL ("list all" - виводити усі), що кодується разом з першою крапкою: .LALL PROMPT MESSAG1 Макровизначення може містити кілька коментарів, причому деякі з них можуть видаватися в лістінгу, а інші - ні. У першому випадку необхідно використовувати директиву .LALL. В другому - кодувати перед коментарем два символи крапки з комою (;;) - ознака придушення виводу коментаря в лістінг. За замовчуванням в асемблері діє директива .XALL, що виводить у листинг тільки команди, що генерують об'єктний код. І, нарешті, можна заборонити появу в лістінгу асемблерного коду в макророзширеннях, особливо при використанні макрокоманди в одній програмі кілька разів. Для цього служить директива .SALL ("suppress all" - придушити весь вивід), що зменшує розмір виведеного лістінгу, але не робить ніякого впливу на розмір об'єктного модуля. Директиви керування лістінгом .LALL, .XALL, .SALL зберігають свою дія по всьому тексту програми, поки інша директива лістінгу не змінить його. Ці директиви можна розміщати в програмі так, щоб в одних макрокомандах роздруковувалися коментарі, в інші - макророзширення, а в третіх придушувався вивід у лістінг. Наступна програма демонструє описану вище властивість директив лістінгу. У програмі визначено два макровизначення INIT2 і PROMPT, розглянуті раніше. Кодовий сегмент містить директиву .SALL для придушення роздруківки INIT2 і перше розширення PROMPT. Для другого розширення PROMPT директива .LALL вказує асемблеру на вивід у лістінг коментаря і макророзширення. Зазначимо, однак, що коментар, відзначений двома символами крапка з коми (;;) у макровизначенні PROMPT, не роздруковується в макрорасширеннях незалежно від дії директив керування лістінгом. Роздрук і заборона макророзширення в лістингу Приклад асемблювання макрокоманди. Використання параметрів в макрокомандах.
Антиботан аватар за замовчуванням

29.05.2014 22:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!