ка відповідного значення псевдокоманди EQU для відповідної BASED-змінної.
. Оператори:
. 1. Оператор присвоювання кодується в 6ти-байтовую SS команду MVN, що має формат:
MVN D1 (L, B1), D2 (B2)
де:
· D1 і D2 - зсув щодо базової адреси, що міститься в регістрі загального призначення;
· B1, B2 - регістри РОН, що містять адресу даних;
· L - довжина операндів в байтах
Команда MVN спеціалізована під копіювання числа з однієї адреси пам'яті в інший. Ця SS-команда вимагає більше число тактів, ніж RX-команда, однак спрощує вихідний еквівалент програми і не вимагає додаткового втручання для правильного копіювання чисел.
. 2. Оператор ADDR кодується у дві 4ех-байтові RX команди: LA і ST, тому в Асемблері IBM 370 відсутня команда, яка б копіювала адреса змінної у відповідне місце пам'яті. Ці команди мають однаковий формат:
LA R1, D2 (X2, B2) R1, D2 (X2, B2)
де:
· R1- регістр РОН;
· D2 - зсув щодо базової адреси, що міститься в регістрі загального призначення;
· X2 -регістри РОН, використовуваний в якості індексу;
· B2 - регістр РОН, що містять адресу даних;
Команда LA завантажує адресу змінної, зазначеної в якості другого операнда в перший операнд - регістр. А команда ST заносить значення першого операнда - регістра в другій операнд - змінну. Таким чином спочатку зчитується адреса змінної з пам'яті в регістр, а потім це значення заноситься в змінну-покажчик.
. 3. Оператор присвоювання - =. Змінні, розташовані по праву сторону від оператора кодуються залежно від типу:
. 3.1. Для BASED-змінних кодування відбувається в два етапи: 1) Завантаження значення покажчика в регістр за допомогою вже наявної у вихідному макеті команди L; 2) Завантаження значення змінної, розташованої по отриманим адресою за допомогою тієї ж команди L.
. 3.2. Завантаження десяткових змінних відбувається за допомогою комманди L. Таким чином, якщо йде привласнення однією десяткової змінної інший, то спочатку йде завантаження другого десяткової змінної в регістр за допомогою комманди L, а потім відбувається копіювання пам'яті за допомогою комманди MVN, описаної раніше.
Модифікація бази даних вихідного макета
У таблицю продукцій (SINT) були додані розроблені синтаксичні правила для змінних і операторів. Розмір таблиці збільшився з 201 до 263 елементів. Матриця суміжності, при цьому, не модифікувалася.
Були введені додаткові типи в семантику мови:
· для змінних, що описують десяткові числа, був введений тип D
· для змінних, що описують покажчики - тип A
· для змінних типу BASED - тип V
Модифікація алгоритму вихідного макета
Функція декларування змінних - ODC1 була модифікована відповідно з новими типами змінних.
При попаданні арифметичним оператором на покажчик на другому проході у функції OPA2, перевіряється, чи є наступний за оператором присвоювання оператор ADDR, і, якщо так, то формується код комманд LA і ST.
Якщо ж за перед опреатора присвоєння варто десяткова змінна, то формується команда MVN, в якості другого операнда якій використовується регістр RRAB містить адресу змінної, який був завантажений в регістр при першому проході.
У функції AVI2 (на другому проході) при визначенні типу змінної - BASED, формуються дві асемблерні команди L: перший завантажує значення змінної-покажчика в регістр RRAB, друга завантажує значення десяткової змінної, розташованої за адресою, завантаженому попередньою командою L в регістр RRAB.
Якщо ж у функції AVI2 зустрічається десяткова змінна, то формується команда L, яка завантажує значення змінної в регістр RRAB.
В результаті, був розроблений компілятор ЯВУ, який має нижче перераховані приемущества і недоліки. Незважаючи на недоліки, нова функціональностть дозволяє виконувати поставлене завдання.
Плюси даної реалізації:
· Використання вбудованих функцій асемблера для роботи з числами і адресами;
· BASED-змінні мають уявлення у вихідному файлі, що дозволяє більш точно відновити вихідний код по вихідному еквіваленту;
· Не використовується пам'ять для BASED-змінних;
Мінуси даної реалізації:
· Тільки...